views:

410

answers:

3

I have some entity:

  public class Album extends GenericAuditedEntity {

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

And when i run HQL like this: em.createQuery("select a from Album a").getResults()

it produses many SQL queries: One for select data from Album's table. Smth like this: select .... from Album_table; And one query for each fetched row, for selecting items. Smth like this: select .... from Item_table iwhere i.Album_id = :Album_id;

But when i run em.createQuery(" select a.id, b.id from Album a left join Item i ").getResults()

it produses one SQL query. But it's result is list of some parameters, that i need put into the entities manually.

How can i build HQL with joins automatically and automatically put the results to the entities? Is it possible?

A: 

dont use lazy fetching. set fetch type to eager

Salandur
That's generally a bad advice. It may be useful from time to time, but setting all associations to eager fetch may result in you pulling the entire database over on each `get()`
ChssPly76
Yes. We have big and old project. With big entities. Eager anywhere - is very slow.
Max
+1  A: 

You need to use join fetch:

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

Note that there are certain side effects to that, described in detail the above link.

ChssPly76
Thx for the link! I found many information there.
Max
+1  A: 

If you are using join fetch then you don't need the IDs, you can retrieve the Entity as Hibernate will also populate the association in it's first-level cache

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

However if you are retrieving the IDs but want populated Objects/Entities then consider using a Constructor

em.createQuery("select new com.xxx.AlbumItem(a.id, b.id) from Album a left join fetch a.itemSet b").getResultList();
Damo
Sorry. But I'd wrote about only IDs for example. In real i need to fetch more than 100 fieds and join about 10 entities, for example.
Max