JPA Specification常用查询+排序+and +or

目录

1.数据库交互层继承父类

2.实现层处理

1.数据库交互层继承父类

public interface TablenameRepository extends JpaRepository<tableName, String>,JpaSpecificationExecutor<tableName> {
   
   

2.实现层处理

1.查询、模糊、in、排序

Specification<TableName> special = new Specification<TableName>{
@Override
    public  Predicate toPredicate(Root<TblCarton2RCardLog> root, CriteriaQuery<?> query,CriteriaBuilder cb) {
        List<Predicate> list = new ArrayList<Predicate>();
        //增加查询条件
        list.add(cb.equal(root.get("cartonNo").as(String.class), cartonNo));//某普通字段

        list.add(cb.equal(root.get("id").get("rCard").as(String.class), rCard));//主键中某字段
        //模糊查询
        list.add(cb.like(root.get("mocode").as(String.class), "%" + mocode + "%"));//like
        //between and
        list.add(cb.between(root.get("frozenDate").as(Long.class), frozenDateStart, frozenDateEnd));
        //大于等于
        list.add(cb.greaterThanOrEqualTo(root.get("id").get("rcard").as(String.class), rCardStart));
        //in
        list.add(root.get("id").get("lotNo").as(String.class).in(lotNos));
        //排序ORDER BY packdate DESC,packtime DESC
        Predicate[] p = new Predicate[list.size()];
        query.where(cb.and(list.toArray(p)));
        query.orderBy(cb.desc(root.get("packDate")),cb.desc(root.get("packTime")));

        return query.getRestriction();
    }

};

List<TableName> tableList = TablenameRepository.finndAll(special);

2.jpa and和orc参考实现

and条件主要是直接add就行

关键是or,需要新建一个List<Predicate> ,两者之间用or进行关联

 @Override
    public Page<TestModule> findVenueList(Pageable pageable,String name,String [] hobbies,Integer age, String brirth) {
            Specification<TestModule> specification=new Specification<TestModule>() {
                @Override
                public Predicate toPredicate(Root<TestModule> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
                    List<Predicate> listAnd=new ArrayList<>(); //组装and语句
                    if(!StringUtils.isBlank(name)) {
                        listAnd.add(criteriaBuilder.like(root.get("name"), "%" + name));  //姓名 模糊查询
                    }
                    if(age!=null) {
                        listAnd.add(criteriaBuilder.equal(root.get("age"), age)); //年龄
                    }
                    if(!StringUtils.isBlank(brirth)) {
                        listAnd.add(criteriaBuilder.like(root.get("brirth"), "%" + brirth + "%")); //出生地 模糊查询
                    }
                    Predicate predicateAnd = criteriaBuilder.and(listAnd.toArray(new Predicate[listAnd.size()])); //AND查询加入查询条件
                    List<Predicate> listOr = new ArrayList<>();///组装or语句
                    if(hobbies!=null && hobbies.length>0) {
                        for (String hoobbie : hobbies) {
                            //爱好多选 用OR链接
                            listOr.add(criteriaBuilder.equal(root.get("hobbie"), hoobbie));
                        }
                    }
                    Predicate predicateOR = criteriaBuilder.or(listOr.toArray(new Predicate[listOr.size()])); //OR查询加入查询条件
                    return criteriaQuery.where(predicateAnd,predicateOR).getRestriction();
                }
            };
            Page<TestModule> page=testModuleRepository.findAll(specification,pageable);
            return page;
    }

猜你喜欢

转载自blog.csdn.net/qq_44691484/article/details/128388614