使用fetch复制Hibernate Eager加载

时间:2016-05-20 20:03:57

标签: java hibernate left-join hql

我有一个名为LocType的类,它有30个元素,与LocProfile的@OneToMany关系有40个元素。我必须做一些计算来确定一旦用户选择一个位置应该关联哪个LocTypeProfile,所以它需要在jsp端可用。

如果我像下面那样定义Eager初始化的关系,当我从LocType中检索元素时,它给了我30个元素,其中列表中存储了一对多关系的实例 - 这就是我想要的行为。

@OneToMany(fetch = FetchType.EAGER, mappedBy = "LocType ", cascade = CascadeType.ALL) 
private List<LocTypeProfile > locTypeProfiles;

现在如果为了良好实践而将映射更改为延迟加载

@OneToMany(mappedBy = "creditTypes")

并尝试使用提取查询

select lt from LocTypes lt left join fetch lt.locTypeProfiles

我得到40个元素,数据被压平。

我的问题是有没有办法在这种情况下复制Eager初始化的行为?

1 个答案:

答案 0 :(得分:1)

join fetch关系执行OneToMany时,您需要在select语句中使用distinct,否则将为每个提取的行创建一个实体。

尝试:

select distinct lt from LocTypes lt left join fetch lt.locTypeProfiles

参考:One-To-Many relationship gets duplicate objects whithout using “distinct”.Why?