JPA复杂查询时间查询分页排序

JPA复杂查询时间查询分页排序,工作上用到,因为项目是jpa,记录。代码囊括了:查询条件+时间范围+分页+排序
其实我也不太想用jpa,但是他也有优点,操作可以兼容多种数据库,mybatis也能,需要额外写代码。但我还是喜欢mybatis

public ResponseResultPage<AlarmEventHistoryPo> getHistory(String eventId, Integer page, Integer size, String startTime, String endTime, Boolean onlyHealthy) {
//直接使用匿名内部类实现接口
Specification<AlarmEventHistoryPo> specification = new Specification<AlarmEventHistoryPo>() {
@Override
public Predicate toPredicate(Root<AlarmEventHistoryPo> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
List<Predicate> predicateList = new ArrayList<>();
// 根据字段
predicateList.add(cb.equal(root.get("eventId").as(String.class), eventId)); // 开始时间
if (StringUtils.isNotEmpty(startTime)) {
predicateList.add(cb.greaterThanOrEqualTo(root.get("createDate").as(String.class), startTime));
}
// 结束时间
if (StringUtils.isNotEmpty(endTime)) {
predicateList.add(cb.lessThanOrEqualTo(root.get("createDate").as(String.class), endTime));
} if (onlyHealthy != null && onlyHealthy) {// and ( pre or pre )
Predicate pred1 = cb.equal(root.get("type").as(String.class), "auto_healthy");
Predicate pred2 = cb.equal(root.get("type").as(String.class), "user_healthy");
predicateList.add(cb.or(pred1, pred2));
} Predicate[] pre = new Predicate[predicateList.size()];
pre = predicateList.toArray(pre);
return query.where(pre).getRestriction();
}
}; // 分页 + 排序
Pageable pageable = PageRequest.of(page - 1, size, new Sort(Sort.Direction.DESC, "createDate"));
Page<AlarmEventHistoryPo> alarmEventHistoryPos = alarmEventHistoryPoDao.findAll(specification, pageable);
if (alarmEventHistoryPos == null) {
return new ResponseResultPage<>(null);
}
}
@Repository
public interface AlarmEventHistoryPoDao extends JpaRepository<AlarmEventHistoryPo, String> {
Page<AlarmEventHistoryPo> findAll(Specification specification, Pageable pageable);
}

2022年7月18日 追加修改----------------------↓↓↓↓↓↓↓↓↓↓

我发现有同学收藏点赞,在高版本hibernate已经注解弃用,不建议使用以上的方式,jpa没有模板引擎,整合其他模板引擎就太复杂。个人建议简单封装Query查询即可,例如下面这样:

import cn.hutool.core.collection.CollUtil;
import org.hibernate.Session;
import org.hibernate.query.Query; import java.util.LinkedHashMap;
import java.util.Map; /**
* @author lingkang
* Created by 2022/7/18
* 封装原因:jpa整合模板引擎太复杂
*/
public class ComplexQueryUtils {
/**
* 对复杂查询的简单封装,有SQL注入处理
* 若有入参,应该从 ?, ?, ? ... 算起, 例如 condition.put(" and vo.id = ?","svcrvtf-0qdYxo4q");
*
* @param session
* @param sql
* @param condition
* @return
*/
public static Query query(Session session, String sql, LinkedHashMap<String, Object> condition) {
if (CollUtil.isEmpty(condition)) {
return session.createQuery(sql);
}
StringBuilder sqlBuilder = new StringBuilder(sql);
for (Map.Entry<String, Object> entry : condition.entrySet())
sqlBuilder.append(entry.getKey()); // 将 ? ? ? 替换成 ?1 ?2 ?3
int i = 1;
int index = sqlBuilder.indexOf("?");
if (index != -1)
for (; ; ) {
sqlBuilder.replace(index, ++index, "?" + i++);
index = sqlBuilder.indexOf("?", index);
if (index == -1)
break;
}
Query query = session.createQuery(sqlBuilder.toString());
i = 1;
for (Map.Entry<String, Object> entry : condition.entrySet())
if (entry.getValue() != null) {
query.setParameter(i++, entry.getValue());
}
return query;
}
}

使用方法:

        TenantVo tenant = UserUtils.getCurrentTenant();
LinkedHashMap<String, Object> condition = new LinkedHashMap<>();
if (tenant != null) {
condition.put(" and fv.tenantId='" + tenant.getId() + "'", null);// 存在SQL注入
}
condition.put(" and vo.id = ?1","svcrvtf-0qdYxo4q");// SQL注入过滤 // AFA
List<ServiceVersionResourceVersionToFileVO> afa = ComplexQueryUtils.query(
serviceDao.getSession(),
"select vo from service vo left join File fv on vo.file.id=fv.id" +
" where vo.serviceVersion.service.id is not null" +
" and fv.id is not null ",
condition
)
// .setFirstResult(9).setMaxResults(10)// 分页,第 10到20条数据
.list();

JPA复杂查询时间查询分页排序的更多相关文章

  1. Oracle查询时间字段并排序

    select * from geimstatus_history twhere to_date(t.data_time,'YYYY-mm-dd') = to_date(sysdate,'YYYY-mm ...

  2. spring boot jpa 多条件组合查询带分页的案例

    spring data jpa 是一个封装了hebernate的dao框架,用于单表操作特别的方便,当然也支持多表,只不过要写sql.对于单表操作,jpake可以通过各种api进行搞定,下面是一个对一 ...

  3. JPA分页查询与条件分页查询

    情有独钟的JPA 平时在写一些小项目时,比较喜欢引用 Spring Data Jpa,其实还是图他写代码快~在日常的开发工作中,分页列表查询基本是随处可见,下面一起看一下如何使用 jpa 进行多条件查 ...

  4. 对于Oracle中分页排序查询语句执行效率的比较分析

    转自:http://bbs.csdn.net/topics/370033478 对于Oracle中分页排序查询语句执行效率的比较分析 作者:lzgame 在工作中我们经常遇到需要在Oracle中进行分 ...

  5. lucene 查询+分页+排序

    lucene 查询+分页+排序 1.定义一个工厂类 LuceneFactory 1 import java.io.IOException; 2 3 import org.apache.lucene.a ...

  6. EF:分页查询 + 条件查询 + 排序

    /// <summary> /// linq扩展类---zxh /// </summary> /// <typeparam name="T">& ...

  7. Spring Data JPA中的动态查询 时间日期

    功能:Spring Data JPA中的动态查询 实现日期查询 页面对应的dto类private String modifiedDate; //实体类 @LastModifiedDate protec ...

  8. 序列化表单为json对象,datagrid带额外参提交一次查询 后台用Spring data JPA 实现带条件的分页查询 多表关联查询

    查询窗口中可以设置很多查询条件 表单中输入的内容转为datagrid的load方法所需的查询条件向原请求地址再次提出新的查询,将结果显示在datagrid中 转换方法看代码注释 <td cols ...

  9. es的查询、排序查询、分页查询、布尔查询、查询结果过滤、高亮查询、聚合函数、python操作es

    今日内容概要 es的查询 Elasticsearch之排序查询 Elasticsearch之分页查询 Elasticsearch之布尔查询 Elasticsearch之查询结果过滤 Elasticse ...

  10. 使用Spring JPA中Page、Pageable接口和Sort类完成分页排序

    显示时,有三个参数,前两个必填,第几页,一页多少个size,第三个参数默认可以不填. 但是发现这个方法已经过时了,通过查看它的源码发现,新方法为静态方法PageRequest of(page,size ...

随机推荐

  1. 整理DB2左补零,右补零的方法

    在项目中经常遇到需要左补零,右补零的情况,在DB2实验环境中展示 1.左补零(1)数字左补零,数字长度不定用right(digits(cast(expression as bigint)),NUM)能 ...

  2. C++的extern关键字在HotSpot VM中的重要应用

    extern关键字有两个用处: (1)extern在C/C++语言中表示函数和全局变量作用范围(可见性)的关键字,这个关键字会告诉编译器,其声明的函数和变量可以在本模块或其它模块中使用. (2)在C+ ...

  3. Python使用socket的UDP协议实现FTP文件服务

    简介 本示例主要是用Python的socket,使用UDP协议实现一个FTP服务端.FTP客户端,用来实现文件的传输.在公司内网下,可以不适用U盘的情况下,纯粹使用网络,来实现文件服务器的搭建,进而实 ...

  4. PostgreSQL学习笔记-6.基础知识:ALTER、TRUNCATE 、View(视图)、TRANSACTION 事务、LOCK 锁

    ALTER TABLE 命令 在 PostgreSQL 中,ALTER TABLE 命令用于添加,修改,删除一张已经存在表的列. 另外你也可以用 ALTER TABLE 命令添加和删除约束. 语法 用 ...

  5. WPF 笔迹算法 从点集转笔迹轮廓

    本文将告诉大家一些笔迹算法,从用户输入的点集,即鼠标轨迹点或触摸轨迹点等,转换为一个可在界面绘制显示笔迹画面的基础数学算法.尽管本文标记的是 WPF 的笔迹算法,然而实际上本文更侧重基础数学计算,理论 ...

  6. 【Qt6】列表模型——几个便捷的列表类型

    前面一些文章,老周简单介绍了在Qt 中使用列表模型的方法.很明显,使用 Item Model 在许多时候还是挺麻烦的--要先建模型,再放数据,最后才构建视图.为了简化这些骚操作,Qt 提供了几个便捷类 ...

  7. [转]深入HBase架构解析

    HBase架构讲解非常清晰的一篇文章,转自 http://www.blogjava.net/DLevin/archive/2015/08/22/426877.htmlhttp://www.blogja ...

  8. Go 接口-契约介绍

    Go 接口-契约介绍 目录 Go 接口-契约介绍 一.接口基本介绍 1.1 接口类型介绍 1.2 为什么要使用接口 1.3 面向接口编程 1.4 接口的定义 二.空接口 2.1 空接口的定义 2.2 ...

  9. 神经网络基础篇:Python 中的广播(Broadcasting in Python)

    Python 中的广播 这是一个不同食物(每100g)中不同营养成分的卡路里含量表格,表格为3行4列,列表示不同的食物种类,从左至右依次为苹果,牛肉,鸡蛋,土豆.行表示不同的营养成分,从上到下依次为碳 ...

  10. Shader学习笔记 (一) :利用shader在一个面绘制出圆

    在各种游戏中,想必大家一定和我一样总是惊叹于游戏画面的各种炫酷的特效. 作为游戏开发中单独列出的一个职业TA(Technology Art),他们会利用GLSL或者HLSL等着色器语言绘制出一幅幅美丽 ...