zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    nput="file" 浏览时只显示指定excel文件,筛选特定文件类型
    SSM三大框架的运行流程、原理、核心技术详解
    HttpServletRequest和ServletRequest的区别
    拦截器(Interceptor)与过滤器(Filter)的区别
    springboot整合webservice
    SpringBoot配置Cors解决跨域请求问题
    多线程同步锁和死锁以及synchronized与static synchronized 的区别
    大批量数据导出excel
    查看MySql版本号命令
    分布式锁初认识
  • 原文地址:https://www.cnblogs.com/Steven5007/p/8612206.html
Copyright © 2011-2022 走看看