繁体   English   中英

Spring Data 中的查询创建 - 动态 where 子句

[英]Query creation in Spring Data - dynamic where clause

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)

谢谢。

一个更简单的选项是在 JPQL 查询中测试参数是否为空:

我的项目示例:

@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);

看看 JPA 规范和谓词,甚至更好的 QueryDSL,它们都由 spring 数据存储库支持。 本文提供一个例子: http ://spring.io/blog/2011/04/26/advanced-spring-data-jpa-specifications-and-querydsl/

另一种解决方案:您可以使用自定义片段接口扩展您的 JPA 存储库接口

  1. 在新界面上定义您的自定义方法

    public interface PersonFragRepository { List<User> findPersonByWhatever( String firstName, String lastName, String age, String gender); }
  2. 提供实施

    public class PersonFragRepositoryImpl implements PersonFragRepository { @PersistenceContext private EntityManager entityManager; @Override List<User> findPersonByWhatever( String firstName, String lastName, String age, String gender) { ... } }
  3. 扩展您的 JPA 接口

    public interface PersonRepository extends JpaRepository<Person, Integer>, PersonFragRepository

暂无
暂无

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

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