3

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

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:不要告诉我使用条件查询因为我正在修复别人的代码,我不想全部重写。ps3:我知道这不是便携式的,但我不在乎。

任何解决方法?我也不想使用多个 OR 子句来模拟这一点。

4

2 回答 2

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中的一个错误。

https://forum.hibernate.org/viewtopic.php?f=1&t=982785&view=previous

[编辑]

您的查询不应该是:

and ( property1 , property2 ) in ( values ((0, 5) , (3, 4)) )

注意额外的括号。

于 2011-08-25T19:12:53.667 回答
0

我使用了多个 OR 版本。由于我的业务需求使我想使用的多列 IN 版本有点复杂。这个问题的答案是:这是不被hibernate支持的,它也不给你灵活地传递他不理解的任何东西。

于 2011-08-25T19:49:03.527 回答