目的:根据入参条件不同,动态组装hql里的where语句。

1. 实现代码

  public List<WrapStatis> queryStatisCriteriaBuilder(String startTime, String endTime, String collectName,

                                                       String imei) {
List<WrapStatis> list = new ArrayList<>();
try {
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
//WrapStatis指定了查询结果返回至自定义对象
CriteriaQuery<WrapStatis> query = cb.createQuery(WrapStatis.class);
Root<StatisEntity> root = query.from(StatisEntity.class);
Path<Calendar> timePath = root.get("createTime");
Path<String> statisName = root.get("statisName");
Path<String> statisNum = root.get("statisNum");
Path<Double> statisRate = root.get("statisRate");
List<Predicate> predicateList = new ArrayList<Predicate>();
Date startDate = DateUtils.parse(startTime,DateUtils.YMD_DASH_WITH_TIME);
Date endDate = DateUtils.parse(endTime,DateUtils.YMD_DASH_WITH_TIME);
if (startTime != null) {
predicateList.add(cb.between(root.get("createTime"),startDate,endDate));
}
if(StringUtils.isNotEmpty(collectName)){
predicateList.add(cb.equal(root.get("collectName"),collectName));
} if(StringUtils.isNotEmpty(imei) && !imei.equals("all")){
predicateList.add(cb.equal(root.get("imei"),imei));
}
Predicate[] predicates = new Predicate[predicateList.size()];
predicates = predicateList.toArray(predicates);
//加上where条件
query.where(predicates);
//指定查询项,select后面的东西
Expression<String> timeStr = cb.function("DATE_FORMAT", String.class, timePath, cb.parameter(String.class, "formatStr"));//格式化日期
query.multiselect(timeStr,statisName,statisNum, statisRate);//返回列
// query.groupBy(root.get(conditionName),timeStr);//分组
// query.orderBy(cb.asc(timeStr));//排序
TypedQuery<WrapStatis> typedQuery = entityManager.createQuery(query);
typedQuery.setParameter("formatStr", Constant.STATIS_DAY);
list = typedQuery.getResultList();
} catch (ParseException e) {
log.error("call StatisService queryStatisCriteriaBuilder is error", e);
}
return list;
}
Constant.STATIS_DAY值为:%Y-%m-%d按天格式化,执行完成打印的sql为:
select date_format(statisenti0_.create_time, ?) as col_0_0_,
statisenti0_.statis_name as col_1_0_,
statisenti0_.statis_num as col_2_0_,
statisenti0_.statis_rate as col_3_0_
from statis statisenti0_
where (statisenti0_.create_time between ? and ?)
and statisenti0_.collect_name=?
and statisenti0_.kepler_version=?
and statisenti0_.device_brand=?
and statisenti0_.rom_version=?
and statisenti0_.alipay_version=?

2. 包装类wrapStatis.class为

  

public class WrapStatis {

    private String date;
private String statisName;
private String statisNum;
private Double statisRate; //省略get/set/构造方法 }

  

spring data jpa hql动态查询案例的更多相关文章

  1. Spring data jpa 复杂动态查询方式总结

    一.Spring data jpa 简介 首先我并不推荐使用jpa作为ORM框架,毕竟对于负责查询的时候还是不太灵活,还是建议使用mybatis,自己写sql比较好.但是如果公司用这个就没办法了,可以 ...

  2. spring data jpa Specification动态查询

    package com.ytkj.entity; import javax.persistence.*; import java.io.Serializable; /** * @Entity * 作用 ...

  3. 【Spring Data 系列学习】Spring Data JPA @Query 注解查询

    [Spring Data 系列学习]Spring Data JPA @Query 注解查询 前面的章节讲述了 Spring Data Jpa 通过声明式对数据库进行操作,上手速度快简单易操作.但同时 ...

  4. Spring data JPA 理解(默认查询 自定义查询 分页查询)及no session 三种处理方法

    简介:Spring Data JPA 其实就是JDK方式(还有一种cglib的方式需要Class)的动态代理 (需要一个接口 有一大堆接口最上边的是Repository接口来自org.springfr ...

  5. Spring Data JPA介绍与简单案例

    一.Spring Data JPA介绍 可以理解为JPA规范的再次封装抽象,底层还是使用了Hibernate的JPA技术实现,引用JPQL(Java Persistence Query Languag ...

  6. spring data jpa 多对多查询

    package com.ytkj.dao; import com.ytkj.entity.Customer; import com.ytkj.entity.Role; import org.sprin ...

  7. spring data jpa 一对多查询

    在一对多关系中,我们习惯把一的一方称之为主表,把多的一方称之为从表.在数据库中建立一对多的关系,需要使用数据库的外键约束. 什么是外键? 指的是从表中有一列,取值参照主表的主键,这一列就是外键. pa ...

  8. Spring Data JPA应用 之查询分析

    在Spring Data JPA应用之常规CRUD操作初体验 - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)尾附上了JpaRepository接口继承关系及方法,可以知道JpaRepos ...

  9. 记: Spring Data Jpa @OneToMany 级联查询被动触发的问题

    I have encountered a bug in using Spring Data Jpa. Specifically,when @OneToMany was used to maintain ...

随机推荐

  1. [PHP] 项目实践中使用的IOC容器思想

    1.容器的意思就是一个全局变量,里面存了很多对象,如果要用到某个对象就从里面取,前提就是要先把对象放进去2.控制反转就是把自己的控制权交给别人3.这两个结合就是,把自己的控制权交给别人并且创建的对象放 ...

  2. 设置VMware中Kali 共享文件夹

    (软件环境: Vmware Workstation 15.5 Pro , Kali Linux2019.3) 1. VMware设置共享目录 2. 安装VMware-Tools 命令: apt-get ...

  3. sqlserver 数据库 创建不同文件组的数据库

  4. 201871010134-周英杰《面向对象程序设计(java)》第十周学习总结

    import java.io.FileInputStream; import java.io.FileNotFoundException; public class ExceptionText1 { ...

  5. 使用angularJS接收json数据并进行数据的显示

    1.引入JS <script type="text/javascript" src="../plugins/angularjs/angular.min.js&quo ...

  6. 组件注册-自定义TypeFilter指定过滤规则

    组件注册-自定义TypeFilter指定过滤规则 4.1 FilterType.ANNOTATION 按照注解方式 4.2 FilterType.ASSIGNABLE_TYPE 按照给定的类型 @Co ...

  7. docker--(MAC ubuntu centos)安装

    MacOS 安装 1.homebrew安装(需要mac密码) brew cask install docker 2.手动下载安装 如果需要手动下载,请点击以下链接下载 Stable 或 Edge 版本 ...

  8. 4.Go-结构体、结构体指针和方法

    4.1.结构体 结构体:将一个或多个变量组合到一起形成新的类型,这个类型就是结构体,结构体是值类型 定义结构体和赋值 //Learn_Go/main.go package main import &q ...

  9. 洛谷 P1209 [USACO1.3]修理牛棚 Barn Repair题解

    题目 打死我也没想到是贪心 虽然是lkx写了贪心题解让我去点赞我才写的这道题 神仙思路 首先排好序 假设我们现在只有一块木板 我们做一个差分数组 对这个差分数组排序之后 一次断开最长的区间 m-1次之 ...

  10. [LeetCode] 903. Valid Permutations for DI Sequence DI序列的有效排列

    We are given S, a length n string of characters from the set {'D', 'I'}. (These letters stand for &q ...