hibernate query.getResultList速度非常缓慢解决

本文记录了一个关于查询执行缓慢的问题及解决方案。在使用JPA或Hibernate等ORM框架时,执行query.getResultList方法出现速度异常缓慢的现象,但同样的SQL直接在数据库执行却很快。通过将参数类型从util的Date改为sql的Date解决了问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天碰到一个问题记录一下,目前还不知道具体是什么原理

场景:

在执行query.getResultList的时候速度异常缓慢,但是把执行的sql语句单独拉出来丢到数据库执行时速度却很快。

解决:

query.setParameter("fltDate", new java.sql.Date(transferRecvDTO.getFltDate().getTime())); 

 可以试下把时间相关的条件改成如上形式,即将util的date类型改为sql的date类型

解决启发:

https://my.oschina.net/u/591938/blog/71639

非常神奇,目前还在探究原因,要是有哪位大佬懂得可以指点下感激不尽!

### Java JPA `query.getResultList()` 方法详解 `query.getResultList()` 是用于执行查询并获取结果列表的方法。此方法返回的结果是一个实现了 `java.util.List` 接口的对象,其中包含了由查询语句检索到的数据实体实例。 对于不同类型的操作和查询条件,该方法的行为如下: - 当查询成功找到匹配项时,会返回包含这些项目的一个非空集合。 - 如果没有任何记录满足给定的查询标准,则返回一个大小为零 (`size()==0`) 的列表而不是 null 值[^1]。 下面给出几个具体的例子来展示不同场景下 `getResultList()` 的应用方式及其可能产生的输出形式: #### 示例一:基本查询操作 ```java // 定义查询字符串 String queryString = "SELECT p FROM Project p"; TypedQuery<Project> query = entityManager.createQuery(queryString, Project.class); List<Project> resultList = query.getResultList(); for (Project project : resultList) { System.out.println(project.getName()); } ``` 这段代码展示了如何通过 JPQL 执行一次简单的 SELECT 查询,并打印出所有项目的名称。这里假设有一个名为 `Project` 的实体类,其具有 `name` 属性。 #### 示例二:带有 IN 子句的复杂查询 ```java Set<String> departmentNames = new HashSet<>(Arrays.asList("Mathematics", "Physics")); String hql = "FROM Professor WHERE department.name IN (:deptNames)"; Query query = session.createQuery(hql).setParameter("deptNames", departmentNames); List<Professor> professors = query.getResultList(); professors.forEach(professor -> System.out.println(professor.getFirstName())); ``` 在这个例子中,使用了 IN 关键字来进行多值比较,最终得到的是教授名单,他们所属院系的名字位于指定集合内[^4]。 #### 示例三:带日期范围过滤器的查询 ```java Date startDate = ... ; // 设置起始时间 Date endDate = ... ; // 设置结束时间 String jpql = "SELECT e FROM Employee e WHERE e.hireDate BETWEEN :startDate AND :endDate"; TypedQuery<Employee> q = em.createQuery(jpql, Employee.class) .setParameter("startDate", startDate, TemporalType.DATE) .setParameter("end", endDate, TemporalType.DATE); List<Employee> employeesHiredInPeriod = q.getResultList(); employeesHiredInPeriod.stream().forEach(System.out::println); ``` 上述片段说明了怎样利用 `BETWEEN...AND...` 结构配合 `TemporalType` 参数化设置,在特定时间段内查找雇员信息[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值