使用Hibernate公式与Postgres特定函数时的SQLGrammarException

时间:2014-10-15 08:52:28

标签: hibernate postgresql

我有一个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解决原始问题会很有趣。

1 个答案:

答案 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

的兼容性