Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to build HQL query, thats joins subtables marked LAZY, automatically?

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?

like image 318
Max Avatar asked Dec 04 '25 17:12

Max


2 Answers

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.

like image 120
ChssPly76 Avatar answered Dec 07 '25 07:12

ChssPly76


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();
like image 22
Damo Avatar answered Dec 07 '25 08:12

Damo



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!