0

我有以下 MySQL 查询:

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

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

@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);

}    

如果我使用 DATEDIFF 函数,它可以工作。

FUNCTION('DATEDIFF', r.startTime, r.endTime)

但我需要几分钟内的确切差异。TIMESTAMPDIFF 满足我的需求。在找不到如何使用 JPA 执行此操作后,我返回到本机查询,但这并不好。有什么选择吗?

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

public class Ride {
  @Column(name = "start_time")
  private LocalDateTime startTime;

  @Column(name = "end_time")
  private LocalDateTime endTime;

 }

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

4

2 回答 2

2

实际上,JPQL 中没有 TIMESTAMPDIFF。

参考:JPQL 中的 timestampdiff 等效项(不使用标准)

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

于 2018-12-02T10:37:07.553 回答
0

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

但是 registerFunction('DATEDIFF') 存在。

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

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

但我建议改用 unix_timestamp() 。

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

于 2020-09-24T04:25:07.767 回答