Hibernate - объединение связанных объектов - PullRequest
8 голосов
/ 26 декабря 2010

У меня есть требование, при котором я должен объединить два не связанных между собой объекта с помощью Hibernate HQL. Вот пример класса POJO

class Product{
int product_id;        
String name;
String description;
}

и

Class Item{
int item_id;
String name;
String description;
int quantity;
int product_id; //Note that there is no composed product object.
}

Теперь я хочу выполнить запрос как select * from Product p оставил внешнее соединение Элемент i на p.product_id = i.item_id

Мне нужен многомерный массив в качестве результата этого запроса, чтобы я мог иметь отдельные экземпляры Product и Item вместо одного, составленного в другом. Есть ли способ сделать это в Hibernate?

Ответы [ 4 ]

5 голосов
/ 27 декабря 2010

Нередко представлять ассоциацию между объектами путем сохранения идентификатора ассоциированного объекта, а не самого ассоциированного объекта. Хранение объекта является более выразительным и безопасным с точки зрения типов и не должно влиять на производительность, поскольку в hibernate есть прокси с отложенной загрузкой.

Но, конечно, вы можете объединять вещи, не отображаемые как ассоциации, в файл сопоставления. Цитирование справочного руководства по :

Может появиться несколько классов, в результате чего в декартовом произведении или "крест" присоединиться.

from Formula, Parameter

from Formula as form, Parameter as param

и

Запросы могут возвращать несколько объектов и / или свойства как массив типа Object []:

select mother, offspr, mate.name
from DomesticCat as mother
    inner join mother.mate as mate
    left outer join mother.kittens as offspr

или в виде списка:

select new list(mother, offspr, mate.name)
from DomesticCat as mother
    inner join mother.mate as mate
    left outer join mother.kittens as offspr

Или - при условии, что класс Family имеет соответствующий конструктор - как фактический типобезопасный Java-объект:

select new Family(mother, mate, offspr)
from DomesticCat as mother
    join mother.mate as mate
    left join mother.kittens as offspr

Вы можете назначить псевдонимы выбранным выражения, использующие как:

select max(bodyWeight) as max, min(bodyWeight) as min, count(*) as n
from Cat cat

Это наиболее полезно, когда используется вместе с выбором новой карты:

select new map( max(bodyWeight) as max, min(bodyWeight) as min, count(*) as n )
from Cat cat

Этот запрос возвращает карту из псевдонимов до выбранных значений.

Объединяя это с простым предложением where, мы получаем:

select product, item
from Product product, Item item
where item.product_id = product.product_id

Редактировать : Я пропустил, что вы хотите external join. В этом случае я не знаю другого способа, кроме сопоставления ассоциации, чтобы вы могли сделать обычное объединение. Обратите внимание, что для этого не требуется конкретная форма результата запроса, то есть вы все равно можете сделать:

select product, item
from Item item
left join item.product as product
3 голосов
/ 26 декабря 2010

Существует обходной путь для объединения идентификаторов в hql здесь .

Однако я рекомендую использовать собственный SQL-запрос здесь.

0 голосов
/ 12 апреля 2016

Попробуйте выделить в предложении select:

select p, (select i from Item where p.product_id = i.item_id) from Product p
0 голосов
/ 27 декабря 2010

Вы можете использовать подвыбор

 from Product p where p.product_id in (select item_id from Item)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...