Java Spring数据中的查询创建-动态where子句
Spring数据中有没有一种方法可以动态地形成where子句 我想做的是有一个方法(类似于findBy/get方法),它运行WHERE和and,并使用前面提到的不为NULL的属性 比如说,Java Spring数据中的查询创建-动态where子句,java,sql,jpa,spring-data-jpa,Java,Sql,Jpa,Spring Data Jpa,Spring数据中有没有一种方法可以动态地形成where子句 我想做的是有一个方法(类似于findBy/get方法),它运行WHERE和and,并使用前面提到的不为NULL的属性 比如说, Consider the object Person [firstName, lastName, age, gender] 我们的方法是这样的 findBy_IfNotNullFirstName_AndIfNotNullLastName_AndIfNotNullAge_AndIfNotNullGender(
Consider the object Person [firstName, lastName, age, gender]
我们的方法是这样的
findBy_IfNotNullFirstName_AndIfNotNullLastName_AndIfNotNullAge_AndIfNotNullGender(String firstName, String lastName, Integer age, String gender)
谢谢。看看JPA规范和谓词,还有更好的QueryDSL,它们都由spring数据存储库支持。 本文提供了一个示例:
另一个解决方案:您可以使用自定义片段接口扩展JPA回购接口
公共接口PersonFragRepository{
列出FindPersonBywhich(
字符串名、字符串名、字符串年龄、字符串性别);
}
公共类PersonFragRepositoryImpl实现PersonFragRepository{
@持久上下文
私人实体管理者实体管理者;
@凌驾
列出FindPersonBywhich(
字符串名、字符串名、字符串年龄、字符串性别){
...
}
}
公共接口PersonRepository
扩展,扩展,扩展,扩展
一个更简单的选项是测试JPQL查询中的参数是否为null: 我的项目示例:
@Query("select m from MessageEntity m " +
"join fetch m.demandeAnalyseEntities d " +
"where (:patientId is null or d.noPtn= :patientId) " +
" and " +
" ( :labNbr is null or d.noLab= :labNbr) " +
" and " +
" ( :reqDate is null or d.dteReq= :reqDate) " +
" and " +
" ( :reqNum is null or d.noReq= :reqNum) "
)
List<MessageEntity> findMessagesWithDemandesOnly(@Param("patientId") Long pid,
@Param("labNbr") Integer labNo,
@Param("reqDate") String reqDate,
@Param("reqNum") Integer reqNum,
Pageable pageable);
@Query(“从MessageEntity m中选择m”+
“加入获取m.DemandeAnalysed实体”+
“其中(:patientId为null或d.noPtn=:patientId)”+
“和”+
“(:labNbr为null或d.noLab=:labNbr)”+
“和”+
“(:reqDate为null或d.dteReq=:reqDate)”+
“和”+
“(:reqNum为null或d.noReq=:reqNum)”
)
列出FindMessageWithDemandOnly(@Param(“patientId”)长pid,
@参数(“labNbr”)整数labNo,
@参数(“reqDate”)字符串reqDate,
@参数(“reqNum”)整数reqNum,
可寻呼(可寻呼);
是。规格是我一直在寻找的。“特别”:我们可以使用Predicate javax.persistence.criteria.CriteriaBuilder.and(Predicate…restrictions)方法捆绑谓词并构建一个规范,我们可以将其提供给存储库findAll。