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

Spring Data JPA中的动态查询 时间日期的更多相关文章

  1. Spring Data JPA 的 Specifications动态查询

    主要的结构: 有时我们在查询某个实体的时候,给定的条件是不固定的,这时就需要动态构建相应的查询语句,在Spring Data JPA中可以通过JpaSpecificationExecutor接口查询. ...

  2. Spring data jpa 实现简单动态查询的通用Specification方法

    本篇前提: SpringBoot中使用Spring Data Jpa 实现简单的动态查询的两种方法 这篇文章中的第二种方法 实现Specification 这块的方法 只适用于一个对象针对某一个固定字 ...

  3. Spring data JPA中使用Specifications动态构建查询

    有时我们在查询某个实体的时候,给定的条件是不固定的,这是我们就需要动态 构建相应的查询语句,在JPA2.0中我们可以通过Criteria接口查询,JPA criteria查询.相比JPQL,其优势是类 ...

  4. 【hql】spring data jpa中 @Query使用hql查询 问题

    spring data jpa中 @Query使用hql查询 问题 使用hql查询, 1.from后面跟的是实体类 不是数据表名 2.字段应该用实体类中的字段 而不是数据表中的属性 实体如下 hql使 ...

  5. spring data jpa使用原生sql查询

    spring data jpa使用原生sql查询 @Repository public interface AjDao extends JpaRepository<Aj,String> { ...

  6. 如何在Spring Data JPA中引入Querydsl

    一.环境说明 基础框架采用Spring Boot.Spring Data JPA.Hibernate.在动态查询中,有一种方式是采用Querydsl的方式. 二.具体配置 1.在pom.xml中,引入 ...

  7. spring data jpa实现多条件查询(分页和不分页)

    目前的spring data jpa已经帮我们干了CRUD的大部分活了,但如果有些活它干不了(CrudRepository接口中没定义),那么只能由我们自己干了.这里要说的就是在它的框架里,如何实现自 ...

  8. Spring MVC和Spring Data JPA之按条件查询和分页(kkpaper分页组件)

    推荐视频:尚硅谷Spring Data JPA视频教程,一学就会,百度一下就有, 后台代码:在DAO层继承Spring Data JPA的PagingAndSortingRepository接口实现的 ...

  9. spring data jpa 利用@Query进行查询

    参照https://blog.csdn.net/yingxiake/article/details/51016234#reply https://blog.csdn.net/choushi300/ar ...

随机推荐

  1. asp.net网站服务器搭建之从零开始

    asp.net网站服务器搭建之从零开始 一 IIS(Internet Information Services)安装:  1.选择"控制面板".  2.点"添加或删除程序 ...

  2. android ------- 运行官方NDK 案例HelloJNI

    下载案例 HelloJNI ,导入工程到Eclipse,  可以直接下载我的案例, 源码下载:https://github.com/DickyQie/android-ndk 目录图 使用命令生成  . ...

  3. mysql创建存储过程,批量建表分表00到99

    这里以sqlyong为软件示例: --创建存储过程DELIMITER $$ CREATE PROCEDURE `createTablesWithIndex`() BEGIN DECLARE `@i` ...

  4. mysql使用sql语句根据经纬度计算距离排序

    CREATE TABLE `locationpoint` ( `id` int(11) NOT NULL, `province` varchar(20) NOT NULL, `city` varcha ...

  5. Leetcode 1013. 总持续时间可被 60 整除的歌曲

    1013. 总持续时间可被 60 整除的歌曲  显示英文描述 我的提交返回竞赛   用户通过次数450 用户尝试次数595 通过次数456 提交次数1236 题目难度Easy 在歌曲列表中,第 i 首 ...

  6. C# 3.0 / C# 3.5 自动属性

    自动属性的好处 自动属性简化了我们在做 C# 开发的时候手写一堆私有成员 + 属性的编程方式,我们只需要使用如下方式声明一个属性,编译器就会自动生成所需的成员变量. 传统属性概念 属性的目的一是封装字 ...

  7. 将本地项目推送至gitee或者github

    将本地项目推送到Git github上的版本和本地版本冲突的解决方法 初始化项目时,在git中新建项目. 在Github中创建了一个Repository之后,会给你列出如何将自己本地项目Push到Gi ...

  8. JS 设置盒子div 跳转

    方式一 window.location.href=”url”; 在当前窗口跳转 方式二 window.open(‘url’) 在新窗口跳转 window.open(‘url’,’_self’) 在当前 ...

  9. 【LeetCode】Valid Parentheses合法括号

    给定一个仅包含 '('.')'.'{'.'}'.'['.']'的字符串,确定输入的字符串是否合法. e.g. "()"."()[]{}"."[()]( ...

  10. new 和 delete

    new 和 delete 众所周知,C中的malloc和free是用来申请和释放内存的,相应的C++中也有对应的申请和释放内存的操作,即是new和delete,但是C++的new和delete比C中的 ...