Смешайте HQL и SQL в одном запросе - PullRequest
3 голосов
/ 08 октября 2009

Я пытаюсь смешать HQL и SQl в одном запросе. Как и при использовании

"из ObjectA obj, TABLE_B tbl, где obj.someProp = tbl.COLUMN"

, потому что моему клиенту нужно будет изменить запрос, и изучение HQL или отображение несопоставленных таблиц исключено: (

Если не в спящем режиме, кто-нибудь знает другой инструмент ORM, который может принять это? другая реализация JPA или JDO?

Я пробовал это, и, конечно, это не работает. Это также имеет смысл для меня: результаты не сопоставляются с объектами, поэтому невозможно получить объекты без некоторого кодирования. Я в основном ищу причины, по которым это не сработает в ближайшее время.

1 Ответ

10 голосов
/ 08 октября 2009

Это действительно не работает, и я не думаю, что это когда-либо будет, но не потому, что "нет никакого способа получить объекты".

Hibernate позволяет использовать простые SQL-запросы и предоставляет множество различных опций для отображения результатов в ваши сущности (или не-сущностные объекты Java). Вы можете написать свой запрос как:

SELECT table_A.*
  FROM table_A JOIN table_B on table_A.some_prop_column = tableB.other_column
 WHERE ...

и выполнить его из Hibernate через:

List objectAs = session.createSQLQuery(yourQuerySQL).addEntity(ObjectA.class).list();

Проблема с смешиванием SQL и HQL заключается в том, что между ними очень легко вступить в конфликт - SQL, генерируемый из HQL, может использовать один псевдоним таблицы, а необработанный SQL - другой; сгенерированный SQL может содержать таблицы / объединения, конфликтующие с необработанным SQL и т. д. *

И это конец, все, что дает вам абсолютно ничего - это даже не поможет вашему варианту использования. Если вы хотите, чтобы кто-то изменил «смешанный» запрос HQL / SQL, ему все равно необходимо знать и SQL, и HQL - по крайней мере, на уровне, необходимом для проведения различия между ними.

Все это говорит о том, что если ваш конечный пользователь должен иметь возможность настраивать этот запрос, возможно, вам следует рассмотреть возможность использования Criteria API , чтобы сгенерировать запрос, который вам нужен на основе ввода пользователя. Если конечный пользователь изменяет фактический запрос в приложении, это зияющая дыра в безопасности, если вы не принимаете крайних мер предосторожности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...