2013-05-09 1 views
0

У меня есть один класс, как это:Hibernate: агрегатные два объекта в одном классе для извлечения данных с одного запросом HQL

public class BookAuthor { 

    private Book book; 
    private Author author; 
} 

книга и автор определены как объекты.

При попытке восстановить данные, таким образом:

final String selectCols = "NEW BookAuthor(b,a)"; 
final org.hibernate.Query q = createQuery(selectCols, params, filters); 
result = q.list(); 
return result; 

Когда Hibernate выполняет «q.list()», он выполняет один запрос для получения удостоверения личности в книги и ее авторов, а затем перебирает результаты получить информацию об авторах и книгах. То есть, в моем журнале, было бы что-то вроде этого:

select a.ID, b.ID 
from authors a , books b 

А затем для каждой строки:

select a.ID, a.name 
where a.ID = ? 

select b.ID, b.title 
where b.ID = ? 

Есть ли способ, чтобы сказать Hibernate, чтобы получить результаты с одним запросом, чтобы улучшить производительность такая? :

select a.ID, a.name, b.ID, b.title 
from authors a , books b 

Заранее благодарен.

Edit:

Сущность определяется со ссылкой на свои таблицы и имена столбцов, как:

public static final String TABLE_NAME = "AUTHOR"; 
@Column(name = "id", nullable = false) 
protected Long id; 

Я думаю, что нет DB ограничения между автором и книгами (это только пример реальных сущностей , но скажем, что могут быть анонимные книги без автора). Спасибо JB Nizet, я выберу запрос и отправлю его здесь через некоторое время.

+0

Как определяются сущности? Каков запрос, который вы выполняете? Почему бы вам просто не выбрать все книги или всех авторов и использовать связь между ними, чтобы получить автора (или книги)? –

ответ

0

Вы не должны рассматривать запросы на спящий режим как SQL-запросы. Я предполагаю, что вы после зимует ленивые загрузки:

Если вы запрашиваете BookAuthor и свойство книги и Автор ленивы загружен, то это будет медленно (потому что спящий режим должен сделать 3 Querys в общей сложности для одного лиц)

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

+0

Я одобрил этот ответ, но я, наконец, не смог заставить его работать с этим подходом класса, содержащего два объекта. Я всегда получал много запросов SQL. Я просто изменил оператор select примерно так: выберите НОВАЯ карта (a.ID, a.name, b.ID, b.заголовок) , а затем отобразите результаты в атрибуты класса. Не изящное решение, но, по крайней мере, это сработало. – krause

0

Обычный случай для этого - это когда вы хотите создать список предметов. В этом случае вы знаете, какие поля вас интересуют. Поэтому вы указываете те в своей проекции (в SQL - предложение SELECT).

Как вы предлагаете делать это нормально. Когда у вас есть сопоставленные отношения, Hibernate сделает это за одно соединение, потому что вы указываете список проекций.

Разница в том, что теперь вы получите список экземпляров Object []. Спящий режим оставит вас без искажения в сущности.