Spring Data JPA中的动态查询 时间日期

功能:Spring Data JPA中的动态查询 实现日期查询 
页面对应的dto类
private String modifiedDate;
//实体类
@LastModifiedDate
protected Calendar modifiedDate;

 
  
 1 public Predicate toPredicate(Root<Infolink> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
 2                     query.distinct(true);  3 List<Predicate> pl = new ArrayList<Predicate>();  4 Join<Infolink, Infosort> join = (Join<Infolink, Infosort>) root  5 .join(root.getModel().getList("infosorts", Infosort.class), JoinType.LEFT);  6 for (Map f : filters) {  7 String field = f.get("field").toString().trim();  8 String value = f.get("value").toString().trim();  9 if (value != null && value.length() > 0) { 10 if ("infosortId".equalsIgnoreCase(field)) { 11 pl.add(cb.equal(join.get("id"), value)); 12  } 13 if ("infolinkTitle".equalsIgnoreCase(field)) { 14 pl.add(cb.like(root.<String>get(field), "%" + value + "%")); 15  } 16 if ("keyword".equalsIgnoreCase(field)) { 17 pl.add(cb.like(root.<String>get(field), "%" + value + "%")); 18  } 19 if ("summary".equalsIgnoreCase(field)) { 20 pl.add(cb.like(root.<String>get(field), "%" + value + "%")); 21  } 22 if ("user".equalsIgnoreCase(field)) { 23 pl.add(cb.equal(root.<String>get(field), value)); 24  } 25 if ("infolinkType".equalsIgnoreCase(field)) { 26 pl.add(cb.equal(root.<String>get(field), value)); 27  } 28 if ("infolinkState".equalsIgnoreCase(field)) { 29 pl.add(cb.equal(root.<String>get(field), value)); 30  } 31 if ("id".equalsIgnoreCase(field)) { 32 pl.add(cb.equal(root.<String>get(field), value)); 33  } 34 // 日期查询 35 if ("modifiedDate".equalsIgnoreCase(field)) { 36 // 处理时间 37 SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); 38  Date startDate; 39  Date endDate; 40 try { 41 startDate = format.parse(value); 42 } catch (ParseException e) { 43 startDate = new Date(946656000000L);// 2000 01 01 44  } 45 endDate = startDate; 46 Calendar calendar = Calendar.getInstance(); 47  calendar.setTime(endDate); 48 calendar.add(Calendar.DATE, 1); 49 endDate = calendar.getTime(); 50 calendar = null; 51 pl.add(cb.between(root.<Date>get(field), startDate, endDate)); 52  } 53  } 54  } 55 pl.add(cb.equal(root.<Integer>get("flag"), 1)); 56 return cb.and(pl.toArray(new Predicate[0])); 57 }
 

效果展示:

================================多条件查询=================================================

二  有多个条件,我们就可以创建一个Predicate集合,最后用CriteriaBuilder的and和or方法进行组合,得到最后的Predicate对象。
  root参数是我们用来对应实体的信息的。criteriaBuilder可以制作查询信息。

  CriteriaBuilder对象里有很多条件方法,比如制定条件:某条数据的创建日期小于今天。

 criteriaBuilder.lessThan(root.get("createDate"), today)   //该方法返回的对象类型是Predicate。正是toPredicate需要返回的值。

 创建一个Predicate集合,最后用CriteriaBuilder的and和or方法进行组合,得到最后的Predicate对象。 //and到一起的话所有条件就是且关系,or就是或关系了。

public List<WeChatGzUserInfoEntity> findByCondition(Date minDate, Date maxDate, String nickname){
        List<WeChatGzUserInfoEntity> resultList = null;
        Specification querySpecifi = new Specification<WeChatGzUserInfoEntity>() {
            @Override
            public Predicate toPredicate(Root<WeChatGzUserInfoEntity> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {

                List<Predicate> predicates = new ArrayList<>();
                if(null != minDate){
                    predicates.add(criteriaBuilder.greaterThan(root.get("subscribeTime"), minDate));
                }
                if(null != maxDate){
                    predicates.add(criteriaBuilder.lessThan(root.get("subscribeTime"), maxDate));
                }
                if(null != nickname){
                    predicates.add(criteriaBuilder.like(root.get("nickname"), "%"+nickname+"%"));
                }
                return criteriaBuilder.and(predicates.toArray(new Predicate[predicates.size()]));
            }
        };
        resultList =  this.weChatGzUserInfoRepository.findAll(querySpecifi);
        return resultList;
    }

相关链接:

  1. Spring Data JPA,一种动态条件查询的写法

   www.cnblogs.com/derry9005/p/6282571.html

  2. Spring data jpa 复杂动态查询方式总结

  https://blog.csdn.net/qq_30054997/article/details/79420141

  3. 带有条件的查询后分页和不带条件查询后分页实现

  https://blog.csdn.net/lihuapiao/article/details/48782843

 

转载于:https://www.cnblogs.com/Steven5007/p/8612206.html

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值