JPA复杂查询时间查询分页排序
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复杂查询时间查询分页排序的更多相关文章
- Oracle查询时间字段并排序
select * from geimstatus_history twhere to_date(t.data_time,'YYYY-mm-dd') = to_date(sysdate,'YYYY-mm ...
- spring boot jpa 多条件组合查询带分页的案例
spring data jpa 是一个封装了hebernate的dao框架,用于单表操作特别的方便,当然也支持多表,只不过要写sql.对于单表操作,jpake可以通过各种api进行搞定,下面是一个对一 ...
- JPA分页查询与条件分页查询
情有独钟的JPA 平时在写一些小项目时,比较喜欢引用 Spring Data Jpa,其实还是图他写代码快~在日常的开发工作中,分页列表查询基本是随处可见,下面一起看一下如何使用 jpa 进行多条件查 ...
- 对于Oracle中分页排序查询语句执行效率的比较分析
转自:http://bbs.csdn.net/topics/370033478 对于Oracle中分页排序查询语句执行效率的比较分析 作者:lzgame 在工作中我们经常遇到需要在Oracle中进行分 ...
- lucene 查询+分页+排序
lucene 查询+分页+排序 1.定义一个工厂类 LuceneFactory 1 import java.io.IOException; 2 3 import org.apache.lucene.a ...
- EF:分页查询 + 条件查询 + 排序
/// <summary> /// linq扩展类---zxh /// </summary> /// <typeparam name="T">& ...
- Spring Data JPA中的动态查询 时间日期
功能:Spring Data JPA中的动态查询 实现日期查询 页面对应的dto类private String modifiedDate; //实体类 @LastModifiedDate protec ...
- 序列化表单为json对象,datagrid带额外参提交一次查询 后台用Spring data JPA 实现带条件的分页查询 多表关联查询
查询窗口中可以设置很多查询条件 表单中输入的内容转为datagrid的load方法所需的查询条件向原请求地址再次提出新的查询,将结果显示在datagrid中 转换方法看代码注释 <td cols ...
- es的查询、排序查询、分页查询、布尔查询、查询结果过滤、高亮查询、聚合函数、python操作es
今日内容概要 es的查询 Elasticsearch之排序查询 Elasticsearch之分页查询 Elasticsearch之布尔查询 Elasticsearch之查询结果过滤 Elasticse ...
- 使用Spring JPA中Page、Pageable接口和Sort类完成分页排序
显示时,有三个参数,前两个必填,第几页,一页多少个size,第三个参数默认可以不填. 但是发现这个方法已经过时了,通过查看它的源码发现,新方法为静态方法PageRequest of(page,size ...
随机推荐
- EarthChat SignalR原理讲解
SignalR原理讲解 SignalR是什么? SignalR 是 Microsoft 开发的一个库,用于 ASP.NET 开发人员实现实时 web 功能.这意味着服务端代码可以实时地推送内容到连接的 ...
- FreeRTOS 操作系统
FreeRTOS操作系统 01 FreeRTOS 的定义和概述 定义:FreeRTOS(Free-Real-Time Operating System)是一个开源的实时操作系统内核,专门为嵌入式系统设 ...
- Bug是如何产生的?
前言 知乎上有一个提问:Bug是如何产生的? ↓↓↓ 今天,我们就这个话题,一起来做个讨论. 个人觉得程序员与BUG的关系,就像空气中的细菌与人的关系一样. 我们不能完全杜绝与它接触,唯一能做的,就是 ...
- 手撕Vue-实现事件相关指令
经过上一篇文章的学习,实现了界面驱动数据更新,接下来实现一下其它相关的指令,比如事件相关的指令,v-on 这个指令的使用频率还是很高的,所以我们先来实现这个指令. v-on 的作用是什么,是不是可以给 ...
- 多维评测指标解读第17届MSU世界编码器大赛全高清10bit赛道结果
超高清视频纤毫毕现的关键一环. 01 主要指标多项第一,带宽节省48% 近日,第17届MSU世界编码器大赛全高清10bit赛道成绩揭晓,阿里自研的H.266/VVC编码器Ali266在该赛道最高效的1 ...
- js前端操作,c#后端下发xml文件
前端: var xmlLanguageDoc; $.ajax({ url: "/GiveMeXML",//此处可随意定义,不一定是路径.在c# ,请求被捕获后,由c ...
- Welcome to YARP - 4.限流 (Rate Limiting)
目录 Welcome to YARP - 1.认识YARP并搭建反向代理服务 Welcome to YARP - 2.配置功能 2.1 - 配置文件(Configuration Files) 2.2 ...
- or等价改写union SQL案例
同事找我优化一些SQL,其中有个SQL比较经典,拿出来分享给大家,从原来执行2分钟,到1.4S出结果. -- 原SQL SELECT count (*) FROM ( SELECT DISTINCT ...
- HTML基础_01
HTML 基础_01 01.初识 HTML 什么是 HTML! Hyper Text Markup Language(超文本标记语言).超文本包括文字.图片.音频.视频.动画等. HTML5,提供了一 ...
- DP:使用最小花费爬楼梯
数组的每个索引做为一个阶梯,第 i个阶梯对应着一个非负数的体力花费值 cost[i](索引从0开始). 每当你爬上一个阶梯你都要花费对应的体力花费值,然后你可以选择继续爬一个阶梯或者爬两个阶梯. 您需 ...