天天看点

spring boot jpa 复杂查询 动态查询 连接and和or 模糊查询 分页查询

最近项目中用到了jpa,刚接触的时候有些激动,以前的到层忽然不用写sql不用去自己实现了,只是取个方法名就实现了,太惊艳了,惊为天人,但是慢慢的就发现不是这么回事了,在动态查询的时候,不知道怎么操作了,忽然感觉这个框架好笨重,在完成很多基础的操作提高效率的同时,
过度的封装也使他用起来不够灵活,整理了下动态查询以及and和or的查询,再次记录下,利己利人。

dao层只要定义一下findAll(Specification specification,PageRequest pageRequest);就可以用了,实现了动态查询,and 和or联合查询,分页查询,以及模糊查询,基本的需求都可以满足了,但是如果在复杂些,需要跨表甚至跨库的话,还是考虑下jdbc把,
不仅效率高也更灵活,加油!      
1 @Override
 2 public SispPage<AnnouncementEntity> findAnnouncementList(Integer pageNo, Integer pageSize, String t1, String t2,
   String t3, String t4) {
 3     Sort sort = new Sort(Sort.Direction.DESC, "createTime");
 4     if (pageNo <= 1) {
 5         pageNo = 0;
 6     } else {
 7         pageNo -= 1;
 8     }
 9     PageRequest pageRequest = PageRequest.of(pageNo, pageSize, sort);
10     Specification<A> specification = new Specification<A>() {
11         @Override
12         public Predicate toPredicate(Root<A> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder
          criteriaBuilder) {
13             List<Predicate> predicates = new ArrayList<>();
14             List<Predicate> predicateOr = new ArrayList<>();
15             Predicate conditionPre;
16             predicates.add(criteriaBuilder.equal(root.get("成员名称").as(String.class), 1));
17             if (StringUtils.isNotBlank(t1)) {
18                 predicates.add(criteriaBuilder.like(root.get("成员名称").as(String.class), "%" + t1+ "%"));
19             }
20 
21             if (StringUtils.isNotBlank(t2)) {
22                 predicates.add(criteriaBuilder.equal(root.get("成员名称").as(String.class), t2));
23             }
24             if (StringUtils.isNotBlank(t3)) {
25                 predicates.add(criteriaBuilder.equal(root.get("成员名称").as(String.class), t3));
26             }
27             if (StringUtils.isNotBlank(t4)) {
28                 predicateOr.add(criteriaBuilder.like(root.get("成员名称").as(String.class), "%" + t4+ "%"));
29                 predicateOr.add(criteriaBuilder.like(root.get("成员名称").as(String.class), "%" + t4+ "%"));
30                 conditionPre = criteriaQuery.where(criteriaBuilder.and(predicates.toArray(new 
            Predicate[predicates.size()])),
31                  criteriaBuilder.or(predicateOr.toArray(new 
            Predicate[predicateOr.size()]))).getRestriction();
32             } else {
33                 conditionPre = criteriaBuilder.and(predicates.toArray(new 
            Predicate[predicates.size()]));
34             }
35             return conditionPre;
36         }
37     };
38 
39     Page<C> c= announcementDao.findAll(specification, pageRequest);
40     List<C> cList= announcementPage.getContent();
41     
42 
43     return cList;
44 }      

继续阅读