Spring Data JPA - 带有时间戳的慢速DB2查询,其中条件为

时间:2016-02-18 13:31:16

标签: java hibernate spring-boot db2 spring-data-jpa

我在一段时间内加载数据的查询存在巨大的性能问题。这是我的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组合,但是另外一个解决方案仍然很好。

0 个答案:

没有答案