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

时间:2014-01-31 14:23:37

标签: java sql jpa spring-data-jpa

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

我想要做的是有一个方法(类似于findBy / get方法)运行WHERE和AND使用提到的NOT NULL属性。

例如,

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

我们的方法看起来像这样

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

感谢。

3 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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