目的:根据入参条件不同,动态组装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. JS高阶---函数

    [问题] [主体] 1.什么是函数? ①实现特定功能 ②多条语句的封装体 ③可以重复执行的代码块 2.为什么用函数? 提高代码的复用性,提升效率 3.如何定义函数? ①函数声明定义 ②函数表达式定义③ ...

  2. day21_7.25 面向对象之继承

    一.继承 什么是继承? 继承是一种关系,就是描述两者之间什么是什么的关系. 在程序中,继承描述的是类与类之间的关系. 例如a如果继承了b,a就具备了b的所有变量与方法,可以直接调用. class B: ...

  3. jmeter,学这些重点就可以了

    前言 对测试来说,jmeter应该是大家使用较频繁的测试工具之一,因为其开源.免费.轻量.功能强大,支持很多种协议,除了测功能,还能做自动化和性能测试: 据某机构的调查,性能并发工具中,jmeter市 ...

  4. 「总结」插头$dp$

    集中做完了插头$dp$ 写一下题解. 一开始学的时候还是挺蒙的. 不过后来站在轮廓线$dp$的角度上来看就简单多了. 其实就是一种联通性$dp$,只不过情况比较多而已了. 本来转移方式有两种.逐行和逐 ...

  5. 字符串s倒序输出

    编程将字符串s倒序输出,要求利用函数递归实现. 输入格式要求:"%s" 提示信息:"input your string:\n" 输出格式要求:"%c& ...

  6. 日常笔记3关于bool类型数组初始化的问题

    一般会有两种考虑,全为true或全为false 赋值方式: <1>memset(boolArray,0,sizeof(Array)); 头文件:#include<cstring> ...

  7. MySQL实战45讲学习笔记:第十四讲

    一.引子 在开发系统的时候,你可能经常需要计算一个表的行数,比如一个交易系统的所有变更记录总数.这时候你可能会想,一条 select count(*) from t 语句不就解决了吗? 但是,你会发现 ...

  8. PS:老权限登录Action 中 WebObjManager有问题,一直登录不起问题

    .ashx后面代码要多继承一个, IRequiresSessionState接口

  9. C#应用程序单例并激活程序的窗口 使其显示在最前端

    public class SoftHelper { ///<summary> /// 该函数设置由不同线程产生的窗口的显示状态 /// </summary> /// <p ...

  10. 解决SpringDataJpa实体类中属性顺序与数据库中生成字段顺序不一致的问题

    一.在application.yml配置中添加数据库根据实体类自动创建数据库表的配置(这里数据库采用MySQL数据库) jpa: database: MYSQL show-sql: true #Hib ...