java - Spring Data JPA - 创建动态查询注释
问题描述
我想知道我是否可以用@Query(value=query) 替换@Query(value=""),其中查询是我可以在某处编辑的字符串。
我必须创建一个函数来使用许多详细信息在我的数据库中进行搜索。
这是我调用我的存储库的代码:
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);
}
推荐阅读
- vim - Vim - 如何保持自动向上或向下滚动直到我停止它(没有任何插件)
- javascript - 在Angular 8中将所有图像转换为base64
- sql - 总和不选择零值
- ios - print() 语句未在 Android Studio 中的颤动 iOS 应用程序中打印到控制台
- postgresql - 查找重复项可以,但为什么删除不起作用?
- javascript - 如何使用 Turn.js 将 filp 效果添加到 epub 页面?
- solr - 使用 gremlin cli 连接到 apache atlas + hbase + solr setup
- mysql - 通过使用 django ORM 查询获取模型对象的所有相关细节?
- php - 非常高级的mysql搜索
- c# - Moq 插入/更新新对象初始化