JpaRepository动态查询sql

本文介绍JpaRepository动态查询sql

在使用前,需要导入

import javax.persistence.EntityManager;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
public List<MovieShow> selectMovieShow(MovieShow movieShow) {
        /**root :我们要查询的类型
         * query:添加查询条件
         * cb: 构建条件
         * specification为一个匿名内部类
         */
        Specification<MovieShow> specification=new Specification<MovieShow>() {
            @Override
            public Predicate toPredicate(Root<MovieShow> root,
                                         CriteriaQuery<?> query,
                                         CriteriaBuilder cb) {
                //创建一个条件的集合
                List<Predicate> predicates = new ArrayList<Predicate>();
                //判断传过来的category是否为null,如果不为null就加到条件中
                if(StringUtils.isNotEmpty(movieShow.getCategory())){
                    /** cb.equal()相当于判断后面两个参数是否一致
                     *root相当于我们的实体类的一个路径,使用get可以获取到我们的字段,因为我的category为String类型
                     * 数据库字段的值category = 前台传过来的值movieShow.getCategory()
                     */
                    predicates.add(cb.equal(root.get("category").as(String.class), movieShow.getCategory()));
                }
                //创建一个条件的集合,长度为上面满足条件的个数
                Predicate[] pre = new Predicate[predicates.size()];
                Predicate p1 = cb.like(root.get("name").as(String.class), "%"+movieShow.getName()+"%");  
        		Predicate p2 = cb.equal(root.get("uuid").as(Integer.class), movieShow.getUuid());  
        		Predicate p3 = cb.gt(root.get("age").as(Integer.class), movieShow.getAge());
        		query.where(cb.and(p3,cb.or(p1,p2)));
                //根据id 倒序排列
                query.orderBy(cb.desc(root.get("release_date")));
                //这句大概意思就是将上面拼接好的条件返回去
                return query.where(predicates.toArray(pre)).getRestriction();

            }
        };
        //这里我们按照返回来的条件进行查询,就能得到我们想要的结果
        List<MovieShow> list= movieShowRepository.findAll(specification);
        return list;
    }

欢迎评论交流

你可能感兴趣的:(JpaRepository动态查询sql)