如何以正确的方式查询Spring数据JPA多条件?

时间:2018-02-07 13:40:07

标签: hibernate spring-boot spring-data-jpa jpql

我试图在没有重复条件和变量的JPA中进行查询:

List<User> findByNameContainingIgnoreCaseAndEnabledOrUsernameContainingIgnoreCaseAndEnabledOrEmailContainingIgnoreCaseAndEnabledOrAgency_NameContainingIgnoreCaseAndEnabled
(String name, boolean status1, String username,boolean status2, String email, boolean status3,String agencyName, boolean status, Pageable pageable);

我不确定我的方式是否合适。但是很难读懂。

1 个答案:

答案 0 :(得分:0)

实现此目的的最佳方法是不使用spring-data的方法扩展方法来构造实际查询,而是在这种情况下使用@Query注释:

@Query(value = "SELECT ...")
List<User> findUsersByParams(
  @Param("name") String name,
  @Param("status1") boolean status1,
  @Param("username") String username,
  @Param("status2") boolean status2, 
  @Param("email") String email, 
  @Param("status3") boolean status3,
  @Param("agencyname") String agencyName, 
  @Param("status") boolean status, 
  Pageable pageable);

这里的关键是value注释中的@Query属性采用JPQL查询来定义一系列命名参数,每个@Param注释方法值与这些参数匹配查询命名参数并自动为您注入。

一个简单的例子是

@Query(value = "SELECT u FROM User u " +
       "WHERE u.userName LIKE CONCAT('%', :userName, '%')")
List<User> findUsersByParams(@Param("userName") String userName, Pageable page);