一、分页多条件查询–重写Specification的toPredicate方法
Spring Data JPA支持JPA2.0的Criteria查询,相应的接口是JpaSpecificationExecutor。
Criteria 查询:是一种类型安全和更面向对象的查询 。
这个接口基本是围绕着Specification接口来定义的, Specification接口中只定义了如下一个方法:
Specification类中的toPredicate方法
Predicate toPredicate(Root<T> root, CriteriaQuery<?> query, CriteriaBuilder cb);
Repo层接口继承JpaSpecificationExecutor接口就可以使用Specification进行动态查询了
这里只介绍Specification类中的toPredicate方法的使用,Criteria 查询更通用的使用教程查看这里
Criteria查询基本概念
Criteria 查询是以元模型的概念为基础的,元模型是为具体持久化单元的受管实体定义的,这些实体可以是实体类,嵌入类或者映射的父类。
Root< T >
Root是个接口,代表查询的对象,T代表返回的Entity类型CriteriaQuery
CriteriaQuery接口:说明查询的条件是什么,比如:select 、from、where、group by、order by等,重写toPredicate一般用不到CriteriaBuilder
用来生成查询条件,也就是Predicate对象(返回的对象),可以组合多个查询条件
CriteriaBuilder中各方法对应的语句
equle : filed = value
gt / greaterThan : filed > value
lt / lessThan : filed < value
ge / greaterThanOrEqualTo : filed >= value
le / lessThanOrEqualTo: filed <= value
notEqule : filed != value
like : filed like value
notLike : filed not like value
示例
分页查询device,实现下面sql语句的效果
SELECT * FROM device WHERE user_id=1 AND (id = 1 OR id =2);
id | userId |
---|---|
1 | 1 |
2 | 1 |
3 | 1 |
Sort sort = new Sort(Sort.Direction.DESC, "id");
Pageable pageable = new PageRequest(pageIndex - 1, pageSize, sort);
Page<ElectronicTagsPO> lTagsPOS = mElectronicTagsRepository.findAll((root, criteriaQuery, criteriaBuilder) -> {
List<Predicate> predicates1 = Lists.newArrayList();
predicates1.add(criteriaBuilder.equal(root.get("userId"), 1));
Predicate lPredicate = criteriaBuilder.and(predicates1.toArray(new Predicate[predicates1.size()]));
List<Predicate> predicates = Lists.newArrayList();
int assetsIdsNum = ids.length;
predicates.add(criteriaBuilder.equal(root.get("id"), 1));
predicates.add(criteriaBuilder.equal(root.get("id"), 2));
return criteriaBuilder.and(lPredicate,criteriaBuilder.or(predicates.toArray(new Predicate[predicates.size()])));
}, pageable);
参考:
Spring-Data-JPA criteria 查询
jpa多条件查询重写Specification的toPredicate方法
二、分页联表查询
这个很简单,就是
1、先单表分页查询,得出分页结果Page< T> page
2、调用< S> Page< S> map(Converter< ? super T, ? extends S> var1);
示例:
Page<Entity> page = mEntity.findEntityByUserId(userId, pageable);
Page<EntityResult> lTagsInfoDTOPage = page.map(Entity-> {
EntityResultl entityResult = new EntityResult();
//其他的数据库进行查询
//设置entityResult 的值
return entityResult ;
});