我有两个实体:用户和地址。用户有“地址”属性:
@OneToMany (mappedBy="user", fetch=FetchType.EAGER)
public List<Adress> getAddress() {
return this.address;
}
public void setAddress(List<Adress> address) {
this.address= address;
}
如上所示,抓取类型非常渴望。
我正在尝试使用Criteria来获取用户列表,如下所示:
List<User> p=session.createCriteria(User.class).list();
不幸的是,如果用户有多个地址,它会重复用户。关闭热切的提取,它不会重复。如何使用条件获取没有重复项目的用户列表?
答案 0 :(得分:3)
不鼓励将*到多个关系映射为FetchType.EAGER。如果您需要提取,请在每个查询的基础上进行。话虽如此,当您使用FetchType.EAGER,Hibernate switches to an outer join select时,因为这对于渴望获取真正相关的情况最有意义。当然,外部联接会导致您看到的行为。我建议您删除FetchType.EAGER并编写适当的查询以获取所需的数据。
不太推荐的替代方法是将@Fetch(FetchMode.SELECT)
添加到您的映射中。这意味着每次加载用户时,它都会发出两个选择:一个用于用户,一个用于地址。这与你无论如何使用懒惰关系基本相同,那么重点是什么?
答案 1 :(得分:0)
设置mycrit.setFetchMode("address", FetchMode.SELECT)
。然后它为关联运行一个单独的选择,你将不会得到欺骗。