Java Spring数据中的查询创建-动态where子句

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(

Spring数据中有没有一种方法可以动态地形成where子句

我想做的是有一个方法(类似于findBy/get方法),它运行WHERE和and,并使用前面提到的不为NULL的属性

比如说,

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(
    字符串名、字符串名、字符串年龄、字符串性别){
    ...
    }
    }
    
  • 扩展您的JPA接口

    公共接口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。