我有一些实体:
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并自动将结果放入实体?有可能吗?
答案 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)
不要使用延迟抓取。将获取类型设置为急切