基础介绍
1.predicate(位于 javax.persistence.criteria包)
此接口的官方说明https://docs.oracle.com/javaee/6/api/javax/persistence/criteria/Predicate.html
接口的声明如下:
public interface Predicate extends Expression {
Predicate.BooleanOperator getOperator();
boolean isNegated();
List> getExpressions();
Predicate not();
public static enum BooleanOperator {
AND,
OR;
private BooleanOperator() {
}
}
}
方法简介:
方法详情:
用途:用于jpa复杂查询
jpa specification复杂查询
使用specification的核心方法:
List<Object> findAll(Specification specification,Pageble pageble);
对于这个方法,可以选择两种方式使用:
1.在repository里面继承JpaSpecificationExecutor类,那么可以直接使用此方法。
2.不用专门继承JpaSpecificationExecutor类,使用基础的JpaRepository。我们需要在repository接口里面声明这个方法,好让jpa自动识别。
然后才可以使用。
第一种方法的使用样例:
eg:
@Repository
public interface RegisterInformationRepository extends JpaSpecificationExecutor<RegisterInformation>, JpaRepository<RegisterInformation, String> {
}
那么具体怎么使用这个方法呢?
给出一个样例:
public Paging>list(String DEPARTMENT_CODE, int page, int size) {
// //排序
Sort.Order order =new Sort.Order(Sort.Direction.DESC, "createdTime");
Sort sort = Sort.by(order);
//分页
Pageable pageable = PageRequest.of(page, size, sort);
/**
* root:是我们要查询的类型
* query:添加查询条件
* cb:构建Predicate
*/
Specification specification = (Specification) (root, criteriaQuery, criteriaBuilder) -> {
Predicate predicate = criteriaBuilder.and(criteriaBuilder.equal(root.get("isRemoved"), false));
if (StringUtils.isNotEmpty(DEPARTMENT_CODE)) {
predicate.getExpressions().add(criteriaBuilder.equal(root.get("DEPARTMENT_CODE"), DEPARTMENT_CODE));
}
return predicate;
};
Page result =departmentRepository.findAll(specification, pageable);