Spring Data JPA(JPQL)问题:在JPA查询中使用TIMESTAMPDIFF函数

时间:2018-12-02 07:21:07

标签: spring spring-boot spring-data-jpa spring-data spring-data-rest

我有以下MySQL查询:

for loop

我想在JPA查询中编写它。下面的代码抛出NullPointerException,它不起作用:

stop()

如果我使用DATEDIFF函数,它将起作用。

select p.name, sum(timestampdiff(MINUTE, r.start_time, r.end_time)) 
from ride r inner join person p on r.driver_id=p.id 
group by p.id

但是我需要几分钟的确切时间。 TIMESTAMPDIFF满足我的需求。 在找不到如何使用JPA执行此操作后,我返回了本机查询,但这不是很好。有其他选择吗?

我使用最新的spring-data-jpa(2.1.3),hibernate-core:5.3.7

@RestResource
public interface SomeRepository extends CrudRepository<Ride, Long> {

@Query("SELECT new com.sample.dto.MyDTO(d.name, SUM(FUNCTION('TIMESTAMPDIFF', 'MINUTE', r.startTime, r.endTime))) " +
      "FROM Ride r JOIN r.driver d WHERE r.startTime BETWEEN ?1 AND ?2 " +
      "GROUP BY d.id" )
  List<MyDTO> findSomething(@Param("startTime") LocalDateTime startTime,
                                   @Param("endTime") LocalDateTime endTime);

}    

目标是找到startTime和endTime之间的总差异(以分钟为单位)。有没有办法使用标准(便携式)JPA做到这一点?

2 个答案:

答案 0 :(得分:1)

实际上,JPQL中没有TIMESTAMPDIFF。

参考:timestampdiff equivalent in JPQL (without using criteria)

因此,您可以做的是使用TIME_TO_SEC(TIMEDIFF(r.startTime, r.endTime)) / 60而不是FUNCTION('TIMESTAMPDIFF', 'MINUTE', r.startTime, r.endTime)

答案 1 :(得分:0)

org.hibernate.dialect.MySQLDialect中没有registerFunction('TIMESTAMPDIFF')。

但是registerFunction('DATEDIFF')存在。

所以您不能在jpa中使用TIMESTAMPDIFF。

您可以添加自定义功能或使用自定义方言。

但是我建议改用unix_timestamp()。

(function('unix_timestamp', startTime)-function('unix_timestamp', endTime))/60