Пользовательский SQL-запрос Hibernate с объединением - избегая возврата списка массивов - PullRequest
12 голосов
/ 25 июня 2010

У меня есть собственный SQL-запрос в Hibernate (3.5.2), в котором я хочу вернуть сопоставленный объект и связанный (присоединенный) объект.Тем не менее, Hibernate, похоже, дает мне список массивов, а не список объектов.

Чтобы немного упростить мою ситуацию: -

Entity1 содержит внешний ключ для Entity2 и сопоставленныйОбъекты настроены так, что Entity1 имеет свойство объекта, ссылающееся на Entity2.Я хочу получить список объектов Entity1, но с уже инициализированной ссылкой на связанный объект (так что связанный объект был загружен).

Теперь я могу сделать это с помощью пользовательского запроса SQL, такого как:

final SQLQuery qry = hibernateSession.createSQLQuery(
    "select {entity1.*}, {entity2.*} from entity1 inner join entity2 on entity1.fk = entity2.id ");

qry.setReadOnly(true);
qry.addEntity("entity1", Entity1.class);
qry.addJoin("entity2", "entity1.entity2");

List list = qry.list();  // Returns list of arrays!!

Это работает, так как все объекты Entity1 правильно инициализированы.Однако список, который я получаю, НЕ является простым списком объектов Entity1.На самом деле это список массивов, где каждый массив содержит 2 элемента - Entity1 и Entity2.Я предполагаю, что это потому, что я поместил две записи псевдонимов в предложении SELECT.

Если я удаляю второй псевдоним (для Entity2), я просто получаю ошибки «столбец не найден» - возможно, потому что Hibernate можетне можете найти поля для инициализации entity2.

Есть идеи?У меня есть запрос, который может вернуть поля для основного и связанного объекта, но я хочу, чтобы возвращаемый список был просто списком объектов Entity1.

Упреждающий комментарий: Да, я знаю, что, вероятно, мог бы реструктурировать это и выполнить запрос другим способом (API критериев и т. Д.).Но это то, что я застрял на данный момент.В этой конкретной ситуации меня сдерживают некоторые другие факторы, поэтому я надеялся, что есть какой-то способ сказать Hibernate, что я хочу!

Спасибо.

Ответы [ 5 ]

1 голос
/ 22 декабря 2015

Здесь Entity 1 (дочерний элемент) содержит внешний ключ для Entity 2 (parent), в pojo класса Entity1 (дочерний) должна быть переменная родительского типа. Пусть это 'E', теперь запрос будет:

Select ent1.* from Entity1 ent1 inner join ent1.E.id

Здесь id - это первичный ключ Entity2

0 голосов
/ 26 августа 2013

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

Существуют различные способы сделать это с помощьюJPA, устаревший Hibernate API, устаревший API критериев и т. Д.

Если вы используете собственный SQL, вы можете сделать это, позвонив по номеру SQLQuery::addFetch, заменивпозвоните на addJoin с:

qry.addFetch("entity2", "entity1", "fk");

или что-то в этом роде.Должен признаться, я не совсем понимаю, что должны означать параметры, и я не смог найти хорошую документацию по нему с помощью быстрого поиска.

0 голосов
/ 25 июня 2010

Посмотрите, может ли это помочь вам ...

0 голосов
/ 23 апреля 2013

Одним из способов может быть использование объединений Theta-Style:

select u from User u join u.permissions p where p.code = :code; 

Разрешения - это коллекция, сопоставленная с классом пользователя.

0 голосов
/ 25 июня 2010

У меня нет спящего режима для тестирования, и, глядя на руководство по спящему режиму, можно предположить небольшое изменение:

final SQLQuery qry = hibernateSession.createSQLQuery(
    "select {entity1.*} from Entity1Table entity1 inner join Entity2Table entity2 on entity1.fk = entity2.id ");

qry.setReadOnly(true);
qry.addEntity("entity1", Entity1.class);
qry.addJoin("entity1.entity2");  

Это должно вернуть вам только объекты Entity1 с Entity2свойство уже инициализировано.

Если это не сработает, попробуйте заменить внутреннее объединение в SQL предложением where, т.е.

select {entity1.*} from Entity1Table entity1, Entity2Table entity2 WHERE entity1.fk = entity2.id ");

Это тогда синтаксически эквивалентно приведенному примерув спящих документах.

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