繁体   English   中英

Spring 数据 JPA - 创建动态查询注释

[英]Spring Data JPA - Create a dynamic Query annotation

我想知道我是否可以用@Query(value=query) 替换@Query(value=""),其中查询是我可以在某处编辑的字符串。

我必须创建一个 function 以使用许多详细信息在我的数据库中搜索。

这是我调用我的存储库的代码:

    public List<FilteringRuleEto> findRuleByParam(FilteringRuleDto filteringRule) {

        String Query = "SELECT rule FROM FilteringRuleEto rule WHERE";

        if (!filteringRule.getRouteClass().equals(null)) {
            Query += " rule.routeClass LIKE ?1 AND";
        }
        if (!filteringRule.getCodeOperator().equals(null)) {
            Query += " rule.codeOperator LIKE ?2 AND";
        }
        if (!filteringRule.getCommercialTrunk().equals(null)) {
            Query += " rule.commercialTrunk LIKE ?3 AND";
        }
        if (!filteringRule.getSupportType().equals(null)) {
            Query += " rule.supportType LIKE ?4 AND";
        }
        if (!filteringRule.getCalledNumber().equals(null)) {
            Query += " rule.calledNumber LIKE ?5 AND";
        }
        if (!filteringRule.getCalledNumberRange().equals(null)) {
            Query += " rule.calledNumberRange = ?6 AND";
        }
        if (!filteringRule.getCalledNumberWhitelist().equals(null)) {
            Query += " rule.calledNumberWhitelist = ?7 AND";
        }
        if (!filteringRule.getCallingNumber().equals(null)) {
            Query += " rule.callingNumber LIKE ?8 AND";
        }
        if (!filteringRule.getCallingNumberRange().equals(null)) {
            Query += " rule.callingNumberRange = ?9 AND";
        }
        if (!filteringRule.getCallingNumberWhitelist().equals(null)) {
            Query += " rule.callingNumberWhitelist = ?10 AND";
        }
        if (!filteringRule.getBeginDate().equals(null)) {
            Query += " rule.beginDate = ?11 AND";
        }
        if (!filteringRule.getEndDate().equals(null)) {
            Query += " rule.endDate = ?12 AND";
        }
        if (!filteringRule.getTgid().equals(null)) {
            Query += " rule.tgid LIKE ?13 AND";
        }
        if (!filteringRule.getFilteringType().equals(null)) {
            Query += " rule.filteringType LIKE ?14 AND";
        }
        if (!filteringRule.getDateInsert().equals(null)) {
            Query += " rule.dateInsert = ?15 AND";
        }
        if (!filteringRule.getEndDate().equals(null)) {
            Query += " rule.dateUpdate = ?16 AND";
        }
        if (!filteringRule.getComment().equals(null)) {
            Query += " rule.comment = ?17 AND";
        }
        Query.substring(0, Query.length() - 3); 

        //Here I want to send the String Query to the Repository
        
        return this.filteringRuleRepository.findRuleByParameters(
                filteringRule.getRouteClass(),
                filteringRule.getCodeOperator(),
                filteringRule.getCommercialTrunk(),
                filteringRule.getSupportType(),
                filteringRule.getCalledNumber(),
                filteringRule.getCalledNumberRange(),
                filteringRule.getCalledNumberWhitelist(),
                filteringRule.getCallingNumber(),
                filteringRule.getCallingNumberRange(),
                filteringRule.getCallingNumberWhitelist(),
                filteringRule.getBeginDate(),
                filteringRule.getEndDate(),
                filteringRule.getTgid(),
                filteringRule.getFilteringType(),
                filteringRule.getDateInsert(),
                filteringRule.getDateUpdate(),
                filteringRule.getComment()
        );

    }

在我的存储库中:

public interface FilteringRuleRepository extends JpaRepository<FilteringRuleEto, Integer> {

     
     @Query(value=theDynamicQuery)
     List<FilteringRuleEto> findRuleByParameters(String routeClass, String codeOperator, String commercialTrunk,
                                                 String supportType, String calledNumber, boolean calledNumberRange,
                                                 boolean calledNumberWhitelist, String callingNumber, boolean callingNumberRange,
                                                 boolean callingNumberWhitelist, OffsetDateTime beginDate, OffsetDateTime endDate,
                                                 String tgid, String filteringType, OffsetDateTime dateInsert, OffsetDateTime dateUpdate,
                                                 String comment);

}

目标是使搜索尽可能快。 当用户想要在数据库中搜索只有 2 个参数时,我不想使用具有 17 个参数的查询。

我跟着这个网站写了我的代码: https://www.baeldung.com/spring-data-jpa-query

但我不认为第 9 部分是我要找的。 又或者我理解错了。

谢谢阅读。

我开发了一个名为spring-dynamic-jpa的库,以便更轻松地使用 JPA 实现动态查询。

您可以使用它来编写查询模板。 查询模板将在执行之前根据您调用方法时的参数构建到不同的查询字符串中。

public interface FilteringRuleRepository extends JpaRepository<FilteringRuleEto, Integer> {
    @DynamicQuery("select t from FilteringRuleEto t\n" +
        "<@where>\n" +
        "  <#if routeClass?has_content>\n" +
        "    and t.routeClass like :routeClass\n" +
        "  </#if>\n" +
        "  <#if codeOperator?has_content>\n" +
        "    and t.codeOperator like :codeOperator\n" +
        "  </#if>\n" +
        "  <#if commercialTrunk?has_content>\n" +
        "    and t.commercialTrunk like :commercialTrunk\n" +
        "  </#if>\n" +
        "</@where>"
    )
    List<FilteringRuleEto> findRuleByParameters(String routeClass, String codeOperator, String commercialTrunk,
                                                String supportType, String calledNumber, boolean calledNumberRange,
                                                boolean calledNumberWhitelist, String callingNumber, boolean callingNumberRange,
                                                boolean callingNumberWhitelist, OffsetDateTime beginDate, OffsetDateTime endDate,
                                                String tgid, String filteringType, OffsetDateTime dateInsert, OffsetDateTime dateUpdate,
                                                String comment);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM