【发布时间】:2016-10-27 18:10:37
【问题描述】:
我有一个自定义查询,它适用于 postgres,但在 H2 中失败。
select distinct(to_char(date_requested,'YYYY'))
from Product
where date_requested is not null
我得到的例外是:
> Caused by: java.lang.IllegalStateException: No data type for node: org.hibernate.hql.internal.ast.tree.MethodNode
\-[METHOD_CALL] MethodNode: '('
+-[METHOD_NAME] IdentNode: 'to_char' {originalText=to_char}
\-[EXPR_LIST] SqlNode: 'exprList'
+-[IDENT] IdentNode: 'date_requested' {originalText=date_requested}
\-[QUOTED_STRING] LiteralNode: ''YYYY''
我的另一个查询,与 to_char 的用法类似,效果很好:
select count(*), requester
from Product
where to_char(date_requested,'YYYY') = '2016'
group by requester
ORDER BY Count(*) desc
我确实有最新版本的 H2,1.4.192,所以我知道 to_char 的使用是可以的。
我在这里做错了什么?为什么第一个查询不适用于 H2?
【问题讨论】:
-
不相关,但是:
distinct不是函数。将表达式放在括号之间不会改变任何不同的东西。distinct (a)与distinct a相同 -
是的,我知道这一点。这是我正在为其编写单元测试的同事的查询。无论如何,是的,无关。感谢您的编辑。
-
在没有混淆层(又名 ORM)的情况下运行查询是否有效
-
不幸的是,我无法检查这个。我的 DBMS 使用的是不支持 to_char 的旧版 H2 驱动程序。将其更改为使用最新的 H2 驱动程序 jar(取自 link,当我尝试连接时出现错误 java.lang.UnsupportedClassVersionError: org/h2/Driver : Unsupported major.minor version 51.0到 H2 数据库。