我有一个名为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初始化的行为?
答案 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?