我有一个XML Hibernate(3.6.10)映射,其中一行应通过公式填充属性持续时间(类型为long)。列startTime和endTime是时间戳。从我的hbm.xml文件:
<property name="duration" formula="extract(epoch from(endTime - startTime))" />
当我在WebLogic服务器中运行它时,会为此创建以下sql:
select this_.extract(this_.epoch from(this_.endTime - this_.startTime))
as formula4_0_ from MYTABLE this_;
这会导致以下异常:
nested exception is org.hibernate.exception.SQLGrammarException: could not execute query
为什么hibernate没有识别(postgres)函数时代和提取?为什么要添加表名? 有没有办法强制执行呢?
hibernate方言设置为“org.hibernate.dialect.PostgreSQLDialect”。
THX
编辑:作为一种解决方法或更好的解决方案,我将在java实体端实现getter方法持续时间。希望减法不会成为应用服务器的性能瓶颈。 ;)对于各种db方言,这似乎更可靠。
然而,如何用hibernate解决原始问题会很有趣。
答案 0 :(得分:2)
epoch
不是一个功能,它更像是一个关键字。虽然oddly it doesn't appear on the list of keywords, even as unreserved。
extract
不是PostgreSQL特有的。它是标准的SQL。这就是为什么它只有SQL委员会可以提出的那种疯狂的语法,而不是像extract('epoch', endtime - starttime)
那样被写成一个理智的正常函数。
但是,epoch
单位指定符 是SQL标准extract
的PostgreSQL扩展。
无论如何,试试:
extract('epoch' FROM (endTime - startTime))
PostgreSQL允许您编写带引号或不带引号的第一个术语(即作为关键字/标识符或文字)。如果你的框架被用作文字,你的框架可能会更好地理解它。
否则,perhaps you'll have more luck with the non-standard to_char
functoin:
SELECT to_char(endTime - startTime, 'J');
因为那只是一个普通的功能。但是,它会返回一个您必须转换为整数的字符串,因此您可能需要:
SELECT CAST( to_char(endTime - startTime, 'J') AS int4 )
...如果你的ORM也没有破坏它。
extract
MySQL supports EXTRACT
,但不是epoch
单位指定符。
[Oracle支持EXTRACT
(http://docs.oracle.com/cd/B19306_01/server.102/b14200/functions050.htm),但不支持epoch
单位指定者。
MS-SQL似乎不支持EXTRACT
,而是希望您改为使用DATEPART
。