目的:根据入参条件不同,动态组装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. liteos互斥锁(七)

    1. 概述 1.1 基本概念 互斥锁又称互斥型信号量,是一种特殊的二值性信号量,用于实现对共享资源的独占式处理. 任意时刻互斥锁的状态只有两种,开锁或闭锁.当有任务持有时,互斥锁处于闭锁状态,这个任务 ...

  2. AssetBundleMaster_ReadMe_CN

    在开始使用之前, 建议先导入到一个空的工程里, 通过ReadMe的一步步引导使你对整个框架以及文件结构进行熟悉, 之后再考虑导入到现有工程中使用, 完整看完教程大概需要2个小时左右. 先看看文件夹结构 ...

  3. Rust中的字符串处理

    一路看过来,怕是我知道的所有语言当,处理最复杂吧. 当然,如果能正确处理,也是能理解最到位的. 这,就是我为什么要学Rust的原因. 暂无用武之地,但逻辑体系和知识点够复杂,才能应对更多事务~ fn ...

  4. 201871010118-唐敬博《面向对象程序设计(java)》第十周学习总结

    博文正文开头格式:(2分) 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.co ...

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

    201871010134-周英杰 <面向对象程序设计(java)>第十二周学习总结 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ ...

  6. eth0: ERROR while getting interface flags: No such device的解决方法、Linux怎么修改IP以及ping不通的处理方法

    首先输入ifconfig命令查看当前的ip信息 发现没有eth0这个网卡设备,有ens33 接着输入命令:ifconfig ens33 192.168.2.110    --  修改临时ip地址,系统 ...

  7. 【使用篇二】SpringBoot文件上传(5)

    一.单个文件上传 1. 在static目录下创建upload.html <!DOCTYPE html> <html> <head> <meta charset ...

  8. CBV和FBV用户认证装饰器

    FBV装饰器用户验证 CBV装饰器用户验证 装饰器位置 或 或

  9. 基于github发布 个人网站/博客

    我们可以使用GitHub去发布自己的网站了(静态网站), 只要经过简单几步即可.这样小伙伴可以给朋友或面试官展示自己个人项目啦. 第一步:创建一个新仓库 第二步:在仓库选择“Settings”页,找到 ...

  10. 【LGR-060】洛谷10月月赛 I

    A - 打字练习 出题:memset0 送分模拟题,按题意模拟即可. 需要注意的是对退格键的判断,如果光标已经在行首,则直接忽略被读入的退格键. B - 小猪佩奇爬树 出题:_QAQ 维护所有相同节点 ...