JPA分页多条件查询和分页联表查询

一、分页多条件查询–重写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 ;
        });

猜你喜欢

转载自blog.csdn.net/xx326664162/article/details/80053173