如何构建HQL查询,即自动加入标记为LAZY的子表?

时间:2009-09-24 14:35:41

标签: java hibernate join hql left-join

我有一些实体:

  public class Album extends GenericAuditedEntity {

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

当我像这样运行HQL时: em.createQuery(“从相册中选择一个”)。getResults()

它产生了许多SQL查询: 一个用于Album表中的选择数据。 Smth是这样的:从Album_table中选择.... 并为每个获取的行提供一个查询,用于选择项目。像这样的Smth: select .... from Item_table iwhere i.Album_id =:Album_id;

但是当我运行em.createQuery(“ 选择a.id,b.id 来自专辑a 左连接项目i “).getResults()

它生成一个SQL查询。但它的结果是一些参数列表,我需要手动放入实体。

如何自动构建具有连接的HQL并自动将结果放入实体?有可能吗?

3 个答案:

答案 0 :(得分:3)

您需要使用join fetch

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

请注意,有一些副作用,详细描述了上述链接。

答案 1 :(得分:2)

如果您使用的是join fetch,那么您不需要ID,您可以检索实体,因为Hibernate也会在其第一级缓存中填充关联

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

但是,如果要检索ID但需要填充的对象/实体,请考虑使用构造函数

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

答案 2 :(得分:-1)

不要使用延迟抓取。将获取类型设置为急切