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