3

我有一些实体:

  public class Album extends GenericAuditedEntity {

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

当我像这样运行 HQL 时: em.createQuery("select a from Album a").getResults()

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

但是当我运行 em.createQuery(" select a.id, b.id from Album a left join Item i ").getResults()

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

如何使用连接自动构建 HQL 并将结果自动放入实体?是否可以?

4

3 回答 3

3

您需要使用join fetch

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

请注意,这有一定的副作用,在上面的链接中有详细描述。

于 2009-09-24T16:24:49.513 回答
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();
于 2009-09-24T17:02:03.480 回答
-1

不要使用延迟获取。将获取类型设置为渴望

于 2009-09-24T15:30:16.990 回答