gpt4 book ai didi

hibernate - 使用具有 Postgres 特定函数的 Hibernate 公式时出现 SQLGrammarException

转载 作者:行者123 更新时间:2023-11-29 13:02:11 24 4
gpt4 key购买 nike

我有一个 XML Hibernate (3.6.10) 映射,其中一行应通过公式填充属性持续时间(类型为长)。列 startTime 和 endTime 是时间戳。来 self 的 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) 函数 epoch 和 extract?为什么要添加表名?有没有办法强制执行?

hibernate 方言设置为“org.hibernate.dialect.PostgreSQLDialect”。

谢谢

编辑:作为解决方法或更好的解决方案,我将在 java 实体端实现 duration 的 getter 方法。希望减法不会成为应用程序服务器上的性能瓶颈。 ;) 对于各种数据库方言,这似乎更可靠。

不过,如何使用 hibernate 解决原始问题会很有趣。

最佳答案

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 function :

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

关于hibernate - 使用具有 Postgres 特定函数的 Hibernate 公式时出现 SQLGrammarException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26378312/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com