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