2009-09-24 1 views
3

У меня есть сущность:Как построить запрос HQL, который соединяет субтитры, помеченные LAZY, автоматически?

public class Album extends GenericAuditedEntity { 

    @OneToMany(fetch = FetchType.LAZY) 
    private Set<Item> itemSet = new HashSet<Item>(); 
    } 

И когда я бегу HQL как это: em.createQuery ("выбрать из альбома а") getResults()

это produses много запросов SQL:. Один для выбора данных из таблицы альбома. Smth вот так: выберите .... из Album_table; И один запрос для каждой выбранной строки для выбора элементов. Smth вот так: выберите .... из Item_table iwhere i.Album_id =: Album_id;

Но когда я запускаю em.createQuery (" выберите a.id, b.id из альбома покинул присоединиться Пункт я ") .getResults()

это produses один SQL запрос. Но результатом является список некоторых параметров, которые мне нужно вводить в сущности вручную.

Как я могу построить HQL с объединениями автоматически и автоматически помещать результаты в объекты? Является ли это возможным?

ответ

3

Вы должны использовать join fetch:

em.createQuery("select a.id, b.id from Album a left join fetch Item i ").getResults(); 

Обратите внимание, что есть некоторые побочные эффекты, которые, подробно описанные выше ссылку.

+0

Thx для связи! Я нашел там много информации. – Max

-1

не использовать ленивый выборка. набор выборки типа для нетерпеливого

+0

Это вообще плохой совет. Он может быть полезен время от времени, но установка всех ассоциаций в нетерпеливую выборку может привести к тому, что вы потянете всю базу данных на каждый 'get()' – ChssPly76

+0

Да. У нас большой и старый проект. С большими сущностями. Желание где угодно - очень медленно. – Max

2

Если вы используете join fetch, то вам не нужны идентификаторы, вы можете получить Entity, как Hibernate будет также заполнить ассоциацию в его кэш первого уровня

em.createQuery("select a from Album a left join fetch a.itemSet").getResultList(); 

Однако если вы запрашиваете идентификаторы но хотите, чтобы населенные объекты/объекты затем рассмотрели использование конструктора

em.createQuery("select new com.xxx.AlbumItem(a.id, b.id) from Album a left join fetch a.itemSet b").getResultList(); 
+0

Извините. Но я писал только об идентификаторах. В реальности я должен получить более 100 пользователей и присоединиться к примерно 10 объектам, например. – Max

Смежные вопросы