Почему Hibernate изменил мой запрос? несколько столбцов с оператором IN - PullRequest
3 голосов
/ 25 августа 2011

Если я отлаживаю, я вижу, что строящаяся строка -

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 пытается быть умным и все портит?

пс: я использую DB2 9
PS2: не говорите мне использовать критерий запроса, потому что я исправляю чей-то код, я не хочу переписывать все это. PS3: я знаю, что это не портативно, но мне все равно.

Есть ли обходные пути? Я также не хочу использовать несколько предложений OR для имитации этого.

Ответы [ 2 ]

0 голосов
/ 25 августа 2011

Я использовал версию с несколькими ИЛИ. Поскольку мои бизнес-требования немного усложнили многоканальную версию IN, которую я хотел использовать. Ответ на этот вопрос таков: это не поддерживается в спящем режиме и не дает вам гибкости для передачи того, что он не понимает, нетронутым.

0 голосов
/ 25 августа 2011

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

[EDIT]

Похоже, что этот человек испытал ту же проблему и переключился на использование createSQLQuery () для ее решения. Это должно быть ошибка в спящем режиме.

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

[EDIT]

Ваш запрос не должен быть:

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

Обратите внимание на дополнительные символы.

...