Spring 数据 JPA (JPQL) 问题:在 JPA 查询中使用 TIMESTAMPDIFF 函数
Spring Data JPA (JPQL) problem: Using TIMESTAMPDIFF function in JPA query
我有以下 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 来做到这一点?
其实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)
org.hibernate.dialect.MySQLDialect.
中没有registerFunction('TIMESTAMPDIFF')
但是 registerFunction('DATEDIFF') 存在。
所以你不能在 jpa 中使用 TIMESTAMPDIFF。
您可以添加自定义功能或使用自定义方言。
但我建议改用 unix_timestamp()。
(function('unix_timestamp', startTime)-function('unix_timestamp', endTime))/60
我有以下 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 来做到这一点?
其实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)
org.hibernate.dialect.MySQLDialect.
中没有registerFunction('TIMESTAMPDIFF')但是 registerFunction('DATEDIFF') 存在。
所以你不能在 jpa 中使用 TIMESTAMPDIFF。
您可以添加自定义功能或使用自定义方言。
但我建议改用 unix_timestamp()。
(function('unix_timestamp', startTime)-function('unix_timestamp', endTime))/60