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. nacos2.X版本无法注册的几个原因以及解决方案(踩坑避雷!)

    在使用nacos+dubbo 注册服务的时候 遇到了无法注册的问题 记录一下踩的坑以及解决方案 com.alibaba.nacos.api.exception.NacosException: Requ ...

  2. 痞子衡嵌入式:MCUBootUtility v5.3发布,利用XMCD轻松使能外部RAM

    -- 痞子衡维护的 NXP-MCUBootUtility 工具距离上一个大版本(v5.0.0)发布过去4个多月了,期间痞子衡也做过三个小版本更新,但不足以单独介绍.这一次痞子衡为大家带来了全新重要版本 ...

  3. Solr Shiro Log4j2 命令执行--文件读取--反序列化--身份权限绕过--命令执行

    Solr Shiro Log4j2 命令执行--文件读取--反序列化--身份权限绕过--命令执行 solr 远程命令执行 (CVE-2019-17558) 漏洞简介 Apache Velocity是一 ...

  4. np.random.uniform()

    np.random.uniform(start,end,second) start:开始数 end:结束数 second:次数,也就是选择几次. 代码结果如下所示: import numpy as n ...

  5. dijkstra算法(朴素 + 堆优化)

    dijkstra算法的大题思路是通过n - 1次迭代,每次迭代把一个点距汇点的最短路确定,当n - 1次循环过后所有点的最短路都已经确定 注意:dijkstra算法只适用于没有负权边的单源最短路 以下 ...

  6. 前端脚手架CLI生成模版命令工具(包括,npm包的发布,脚手架的搭建,注意事项,优化等)

    写在前面 这是停更以后,续更的一篇文章. 为什么好长时间都没有更新,因为去其他平台更新了,包括掘金,思否,简书等. 在那些地方感觉没有归属感,有的平台原创审核很麻烦,简书号称可以获得打赏,可是码了几十 ...

  7. 前端本地导出文件 导出txt sql (简版版的字符串案例)

    1.首页明确要导出的根据 一般有图片 excel  文字.针对不同的文件类型 配置不同的参数 2.知识点 Blob          URL.createObjectUrl new Blob( arr ...

  8. python之range()、arange()和linspace()

    目录 range() arange() linspace() range() range()格式如:range(start, stop, step) start:开始的数值,默认从0开始 stop:结 ...

  9. VUE同级组件之前方法调用

    实现:Index.vue页面调用nav.vue页面里的getLeftMenu()方法 一.首先先建一个公共文件,命名eventBus.js,内空为: import Vue from 'vue'expo ...

  10. 逻辑回归(Logistic Regression) ----转载

    概要: 1. 介绍Logistic Regression的数学模型,推导并详细解释求解最优回归系数的过程:2. Python实现Logistic Regression的基本版:3. 介绍sklearn ...