我有一个用例,我需要找到客户的分页列表,客户看起来像这样:
@Entity
public class Customer {
@Id
private Long id;
private String firstName;
private String lastName;
private String phone;
private String mail;
}
然后我有我的存储库界面
public interface CustomerRepository extends PagingAndSortingRepository<Customer, Long> {
Optional<Customer> findById(Long id);
...
}
我的界面扩展了PagingAndSortingRepository以提供可分页的结果。
我还有一个输入框,用户可以在其中输入任何字符串。现在,我想给他返回结果页面,其中一个字段(任何客户字段)中包含输入字符串。
我不想使用命名查询。是否可以通过PagingAndSortingRepository存储库实现此目标的明智方法,还是需要使用Specification接口并实现分页?
答案 0 :(得分:1)
你不能只是做
@Query("select c from Customer c where c.firstName like :filter"
+ " or c.lastName like :filter or c.emailAddress like :filter.......")
Page<Customer> filter(@Param("filter") String filter);
您也可以使用QueryDsl。
扩展其他接口:
public interface CustomerRepository extends PagingAndSortingRepository<Customer, Long>, QueryDslPredicateExecutor<Customer>{
}
添加相关的构建工具:
然后您可以调用继承的方法:
Page<Customer> findAll(Predicate predicate, Pageable pageable)
使用方式:
Page<Customer> page =repo.findAll(QCustomer.customer.firstName.like(filter)
.or(QCustomer.customer.lastName.like(filter).or(...));
参考文献:
https://spring.io/blog/2011/04/26/advanced-spring-data-jpa-specifications-and-querydsl/