如果我调试,我可以看到我正在构建的字符串是
and ( property1 , property2 ) in ( values (0, 5) , (3, 4) )
但是Hibernate认为最好像这样转换它
and (
(
tabAlias.COLUMN1 , tabAlias.COLUMN2
) in (
values
(0, 5) ,
)
)
我不介意添加额外的() Hibernate,但我不明白为什么在(0,5)之后,它没有出现(3,4) ??为什么Hibernate试图变得聪明并搞砸了?
ps:我正在使用DB2 9 ps2:不要告诉我使用条件查询cuz'我正在修复somebodyelse的代码,我不想重写它。 ps3:我知道这不便携,但我不在乎。
有任何变通方法吗?我也不想使用多个OR子句来模拟它。
答案 0 :(得分:0)
HQL不是SQL。 Hibernate解析HQL并基于它构建新的SQL查询。我怀疑你在HQL中不支持你想要做的事情。通常情况下会出现错误,但由于某种原因,它会接受您的HQL并生成无效的SQL。
如果要使用SQL,可以与Session.connection()建立连接。
您可以通过稍微修改它来使语法正常工作。这可能有所帮助: http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html/queryhql.html#queryhql-tuple
[编辑]
看起来这个人遇到了同样的问题,并转而使用createSQLQuery()来解决它。它一定是hibernate中的一个bug。
https://forum.hibernate.org/viewtopic.php?f=1&t=982785&view=previous
[编辑]
您的查询不应该是:
and ( property1 , property2 ) in ( values ((0, 5) , (3, 4)) )
注意额外的parens。
答案 1 :(得分:0)
我使用了多个OR版本。 由于我的业务需求使我想要使用的多列IN版本有点复杂。 这个问题的答案是:hibernate不支持这种方式,也不能让你灵活地传递任何他不理解的东西。