功能: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