我在一段时间内加载数据的查询存在巨大的性能问题。这是我的JpaRepository包含查询:
public interface MyTableRepository extends JpaRepository<MyTable, Integer> {
@Query("SELECT t FROM MyTable t WHERE t.dateTime BETWEEN :start AND :end")
List<MyTable> findByDateTimeRange(
@Param("start") Instant start,
@Param("end") Instant end
);
}
这是我的实体:
@Entity()
public class MyTable {
@Column()
private LocalDate date;
@Column()
private LocalTime time;
@Formula("timestamp(date, time)")
private Instant dateTime;
//getters and setters...
}
我这样称呼它:
myTableRepository.findByDateTimeRange(
Instant.parse("2016-02-17T12:00:00Z"), Instant.parse("2016-02-17T13:00:00Z"));
它产生预期的查询并产生预期的结果,但是大约需要2分钟才能完成,这是不可接受的。如果我在DB2中使用BETWEEN '2016-02-17 12:00:00' AND '2016-02-17 13:00:00'
直接在DB2中执行相同的查询,那么只需要大约150ms来完成相同的结果。
我预计在执行的查询中将Instants映射到TIMESTAMPS会出现问题,但是当打开Hibernate时,所有内容似乎都是正确的:
2016-02-18 14:05:52.696 TRACE 12796 --- [ main] o.h.type.descriptor.sql.BasicBinder : binding parameter [1] as [TIMESTAMP] - [Wed Feb 17 13:00:00 CET 2016]
2016-02-18 14:05:52.697 TRACE 12796 --- [ main] o.h.type.descriptor.sql.BasicBinder : binding parameter [2] as [TIMESTAMP] - [Wed Feb 17 14:00:00 CET 2016]
这是结果查询:
select
my_table0_.date as date1_0_,
my_table0_.time as time2_0_,
timestamp(my_table0_.date,
my_table0_.time) as formula0_
from
my_table my_table0_
where
timestamp(my_table0_.date, my_table0_.time) between ? and ?
任何想法如何解决这个问题?从Instant切换到其他时间类没有任何效果(例如java.sql.Timestamp)。
更新:它似乎与timestamp(my_table0_.date, my_table0_.time)
有关。使用实际的TIMESTAMP字段可以工作,但遗憾的是没有一个我无法使用。现在我按日期分割我的陈述并将结果用Java组合,但是另外一个解决方案仍然很好。