美文网首页
jpa动态sql

jpa动态sql

作者: 紫色红色黑色 | 来源:发表于2021-03-12 15:44 被阅读0次

    1.EntityManager

    group by 指定字段

    CriteriaBuilder cb = entityManager.getCriteriaBuilder();
    CriteriaQuery<Tuple> query = cb.createTupleQuery();
    Root<Student> root = query.from(Student.class);
    
    List<Predicate> predicates = Lists.newArrayList();
    predicates.add(cb.in(root.get("status")).value(Lists.newArrayList(0, 1)));
    if (StringUtils.isNotBlank(name)) {
        predicates.add(cb.like(root.get("name"), "%" + name + "%"));
    }
    
    CriteriaQuery<Tuple> criteriaQuery = query.select(cb.tuple(root.get("name"), root.get("id"))).where(predicates.toArray(new Predicate[0])).groupBy(root.get("name"), root.get("id"));
    entityManager.createQuery(criteriaQuery).getResultList();
    

    2.query dsl

    QStudent student = QStudent.Student;
    jpaQueryFactory.selectFrom(student).where(student.name.eq("lucy")).fetchFirst();
    

    以上两种是定义DAO的实现类。在实现类中写查询方法,第一种需要注入EntityManager,第二种需要注入JpaQueryFactory。

    下面在接口中写动态sql

    3.JpaSpecificationExecutor

    // duty 包含 post ,post 包含 department
    default List<Duty> list(String start, String end, Collection<Department> departments, Collection<String> names) {
        return this.findAll((Specification<Duty>) (root, query, cb) -> {
            List<Predicate> predicates = Lists.newArrayList();
            predicates.add(cb.equal(root.get("flag"), true));
            if (StringUtils.isNotBlank(start)) {
                predicates.add(cb.greaterThanOrEqualTo(root.get("date"), start));
            }
            if (StringUtils.isNotBlank(end)) {
                predicates.add(cb.lessThanOrEqualTo(root.get("date"), end));
            }
            if (CollectionUtils.isNotEmpty(departments)) {
                predicates.add(cb.in(root.get("post").get("department")).value(departments));
            }
            if (CollectionUtils.isNotEmpty(names)) {
                predicates.add(cb.in(root.get("post").get("name")).value(names));
            }
            return cb.and(predicates.toArray(new Predicate[0]));
        });
    }
    

    4.QuerydslPredicateExecutor

    default Iterable<Student> findByParams(String name, String telephone) {
        QStudent student = QStudent.student;
        BooleanBuilder builder = new BooleanBuilder();
        if (StringUtils.isNotBlank(name)) {
            builder.and(messageMember.name.like("%" + name + "%"));
        }
        if (StringUtils.isNotBlank(telephone)) {
            builder.and(messageMember.telephone.like("%" + telephone + "%"));
        }
        return this.findAll(builder);
    }
    

    代码结构

    实现类和接口方式组合。下列接口StudentDao就具有了selectCustom方法

    interface StudentDao extends StudentCustomDao, JpaRepository<Student, Integer>, JpaSpecificationExecutor<Student>, QuerydslPredicateExecutor<Student> {
        Page<Student> selectAll(Pageable of);
    
        default Student selectOne(Integer id){
    
        }
    
    }
    
    
    
    interface StudentCustomDao {
        Page<Student> selectCustom();
    }
    
    class StudentCustomDaoImpl implments StudentCustomDao {
    
        EntityManager entityManager;
        
    
        public Page<Student> selectCustom(){
    
        }
    
    }
    

    相关文章

      网友评论

          本文标题:jpa动态sql

          本文链接:https://www.haomeiwen.com/subject/rhrzqltx.html