SQL 服务器中使用 Hibernate JPA 的两个日期之间的平均差异
Average of difference between two dates using Hibernate JPA in SQL Server
我有一个 table 列:id、task_type、start_time、end_time。我需要获得每项任务所花费的平均时间。在 SQL 查询中我可以做:
SELECT task_type, AVG(DATEDIFF(MS, end_time, start_time)) AS average_time GROUP BY task_type
我无法在 JPA 中使用 DATEDIFF,因为它不受支持。如果我将 nativeQury 传递给 JPA "@Query"
它会将 SELECT 语句中未包含的列名称显示为无效,假设如果我将上述查询作为本机查询传递我会收到错误 the column name id is not valid
.
如果有人能够指出我在这里遗漏的内容,那将是一个很大的帮助。
注意:该项目是微服务架构,数据库存储在微软SQL服务器中,API正在SpringBoot中编写。
关于调用特定于供应商和用户定义的函数,请参阅 this tutorial 从 JPQL 中执行此操作的方法。
由于 MS
参数,function()
语法可能对您不起作用(您可以 可能 为它注册一个 Hibernate 用户类型,即一个麻烦)。不过,在方言中注册一个函数应该可以正常工作。您可能希望自己实施 SQLFunction
,而不是使用 StandardSQLFunction
实施。
至于为什么本机查询对您不起作用,class 您尝试将查询映射到的结果是什么?尝试使用与查询中使用的别名具有相同 属性 名称的接口或 DTO,类似于您应该使用 projections. If that doesn't work, a result set mapping 的方式。
我在 JPQL 中的写法:
SELECT ent.taskType, AVG( EXTRACT (EPOCH FROM (ent.endTime - ent.startTime)))
FROM Entity ent
GROUP BY ent.taskType
这是几秒钟后的结果,您可以将提取的结果操作成您想要在视图中显示的任何内容。
我通过创建投影 class 和 JPQL 查询解决了这个问题。
我有一个 table 列:id、task_type、start_time、end_time。我需要获得每项任务所花费的平均时间。在 SQL 查询中我可以做:
SELECT task_type, AVG(DATEDIFF(MS, end_time, start_time)) AS average_time GROUP BY task_type
我无法在 JPA 中使用 DATEDIFF,因为它不受支持。如果我将 nativeQury 传递给 JPA "@Query"
它会将 SELECT 语句中未包含的列名称显示为无效,假设如果我将上述查询作为本机查询传递我会收到错误 the column name id is not valid
.
如果有人能够指出我在这里遗漏的内容,那将是一个很大的帮助。
注意:该项目是微服务架构,数据库存储在微软SQL服务器中,API正在SpringBoot中编写。
关于调用特定于供应商和用户定义的函数,请参阅 this tutorial 从 JPQL 中执行此操作的方法。
由于 MS
参数,function()
语法可能对您不起作用(您可以 可能 为它注册一个 Hibernate 用户类型,即一个麻烦)。不过,在方言中注册一个函数应该可以正常工作。您可能希望自己实施 SQLFunction
,而不是使用 StandardSQLFunction
实施。
至于为什么本机查询对您不起作用,class 您尝试将查询映射到的结果是什么?尝试使用与查询中使用的别名具有相同 属性 名称的接口或 DTO,类似于您应该使用 projections. If that doesn't work, a result set mapping 的方式。
我在 JPQL 中的写法:
SELECT ent.taskType, AVG( EXTRACT (EPOCH FROM (ent.endTime - ent.startTime)))
FROM Entity ent
GROUP BY ent.taskType
这是几秒钟后的结果,您可以将提取的结果操作成您想要在视图中显示的任何内容。
我通过创建投影 class 和 JPQL 查询解决了这个问题。