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



我有以下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完成这项工作后,我返回了本机查询,但这并不好。有其他选择吗?

我使用最新的春季数据jpa(2.1.3(,hibernate内核:5.3.7

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

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

实际上,JPQL中没有TIMESTAMPDIFF。

参考:JPQL中的时间戳差等价(不使用标准(

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

org.hibernate.方言.MySQL方言中没有registerFunction('IMESTAMPDIFF'(。

但是registerFunction("DATEDIFF"(存在。

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

您可以添加自定义函数或使用自定义方言。

但我建议使用unix_timestamp((

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

最新更新