【问题标题】:Query creation in Spring Data - dynamic where clauseSpring Data 中的查询创建 - 动态 where 子句
【发布时间】:2014-02-24 06:45:37
【问题描述】:

Spring数据中有没有办法动态形成where子句?

我想要做的是有一个方法(类似于 findBy / get 方法),它使用上述非空属性运行 WHERE 和 AND。

例如,

Consider the object Person [firstName, lastName, age, gender]

我们的方法看起来像这样

findBy_IfNotNullFirstName_AndIfNotNullLastName_AndIfNotNullAge_AndIfNotNullGender(String firstName, String lastName, Integer age, String gender)

谢谢。

【问题讨论】:

    标签: java sql jpa spring-data-jpa


    【解决方案1】:

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

    【讨论】:

    • 是的。规格是我一直在寻找的。 “特别”:我们可以使用 Predicate javax.persistence.criteria.CriteriaBuilder.and(Predicate...限制) 方法来捆绑谓词并构建一个规范,我们可以将其提供给 Repository findAll。
    【解决方案2】:

    一个更简单的选择是在 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);
    

    【讨论】:

      【解决方案3】:

      另一种解决方案:您可以使用自定义片段接口扩展您的 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
        

      【讨论】:

        猜你喜欢
        • 2019-05-20
        • 2020-12-23
        • 2020-06-19
        • 2015-09-20
        • 2016-11-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多