如何通过分页进行任何字段搜索

时间:2019-02-22 12:24:28

标签: java spring jpa spring-data-jpa spring-data

我有一个用例,我需要找到客户的分页列表,客户看起来像这样:

@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接口并实现分页?

1 个答案:

答案 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/