使用Criteria和获取类型渴望的问题

时间:2011-07-19 02:06:04

标签: java hibernate criteria

我有两个实体:用户和地址。用户有“地址”属性:

@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();

不幸的是,如果用户有多个地址,它会重复用户。关闭热切的提取,它不会重复。如何使用条件获取没有重复项目的用户列表?

2 个答案:

答案 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)。然后它为关联运行一个单独的选择,你将不会得到欺骗。