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 ...
随机推荐
- Spring-Boot-Starter 学习笔记(1)
Spring-Boot-Starter 1. 准备配置类和 Bean 对象 Spring Boot 提供了两个注解: @Configuration:Spring 提供的配置类注解,作用在类上,代表整个 ...
- 使用Blazor WASM实现可取消的多文件带校验并发分片上传
前言 上传大文件时,原始HTTP文件上传功能可能会影响使用体验,此时使用分片上传功能可以有效避免原始上传的弊端.由于分片上传不是HTTP标准的一部分,所以只能自行开发相互配合的服务端和客户端.文件分片 ...
- How to start with Gradle?
How to start with Gradle? Download the latest Gradle release from http://www.gradle.org/downloads Se ...
- 2023_10_09_MYSQL_DAY_01_笔记
2023_10_09_MYSQL_DAY_01 #运算符的优先级 SELECT ename, job, sal FROM emp WHERE ( job='SALESMAN' OR job='PRES ...
- K8s部署轻量级日志收集系统EFK(elasticsear + filebeat + kibana)
目录 K8s部署EFK(elasticsear + filebeat + kibana)日志收集 一.准备镜像 二.搭建Elasticsearch + kibana 1.在可执行kubectl命令的服 ...
- Util应用框架 7.x 来了
什么是Util应用框架? Util是一个.Net平台下的应用框架,旨在提升中小团队的开发能力,由工具类.分层架构基类.Ui组件,配套代码生成模板,权限等组成. Util应用框架 7.x介绍 Util应 ...
- 随身wifi 救砖过程记录
7,8块钱买了个随身wifi,准备刷机玩的,后来不知道刷错了boot还是啥,加电后灯都不亮了,前期没备份,于是网上找了各种教程,下面记录下: 变砖后有个底层的9008驱动协议可以刷机,下面的过程都是基 ...
- springboot整合shiro框架学习
springboot整合shiro框架做用户认证与授权 springboot整合shiro框架的流程主要分为: 导入shiro依赖 <dependency> <groupId> ...
- maven2介绍(转)
http://ttitfly.iteye.com/blog/152557 Maven2主要配置文件:pom.xml和settings.xml. POM是Maven的核心对象模型,对于项目,一般只需要p ...
- Util应用框架基础(六) - 日志记录(四) - 写入 Exceptionless
本文是Util应用框架日志记录的第四篇,介绍安装和写入 Exceptionless 日志系统的配置方法. Exceptionless 是一个日志管理系统,使用 Asp.Net Core 开发,比 Se ...