为什么Hibernate会改变我的QUERY?带有IN运算符的多列

时间:2011-08-25 18:59:34

标签: java hibernate db2 in-operator

如果我调试,我可以看到我正在构建的字符串是

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子句来模拟它。

2 个答案:

答案 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不支持这种方式,也不能让你灵活地传递任何他不理解的东西。