gpt4 book ai didi

java - Hibernate 和多次返回相同项目的条件

转载 作者:行者123 更新时间:2023-12-01 23:30:21 25 4
gpt4 key购买 nike

我的“学生”和“类(class)”是多对多的关系。中间有一个链接表。

如果我想通过以下方式检索所有具有 HQL 的学生,一切都很好:

Query queryObject = getSession().createQuery("from Student");
return queryObject.list();

使用上面的代码,如果有三个学生,我会得到三个学生的列表。

但是,如果我使用条件,则只要链接表中没有关联就可以了。

Criteria crit =  getSession().createCriteria(Student.getClass());        
return crit.list();

使用第二个代码,仅当链接表为空时我才得到三个结果。然而,当我添加关联时,我得到 6 个结果。查看日志,Hibernate 生成了多个选择。怎么可能?

有人可以解释为什么会发生这种情况吗?如何修复条件以便仅返回这三个记录一次?

编辑

在 Student 类中,我以这种方式映射:

@ManyToMany(fetch=FetchType.EAGER)
@JoinTable(
name="room_student_rel"
, joinColumns={
@JoinColumn(name="id_student")
}
, inverseJoinColumns={
@JoinColumn(name="id_room")
}
)
private List<Room> rooms;

在我这样映射的房间(类(class))中:

@OneToMany(fetch=FetchType.EAGER,  mappedBy="room")
@Fetch(FetchMode.SELECT)
private List<RoomStudent> roomStudents;

最佳答案

为了扩展我之前的评论,当 FetchType 设置为 EAGER 时,Hibernate 将尝试选择使用外部联接。

参见下面的 2.2.5.5:

http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html_single/

有关其含义,请参见此处:

Hibernate Criteria returns children multiple times with FetchType.EAGER

现在您还可以指定 FetchMode (根据您的条件.setFetchMode("assocFiled",FetchMode.LAZY) )将其设置为 JOIN 以外的其他内容,或者您​​可以使用类似 criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY); 过滤重复项。

理想情况下,您应该避免在实体映射上使用 EAGER,并且在需要急切获取的情况下,使用某些提示或通过 FetchProfile 在实体加载时显式启用它,然后在需要时处理重复项。

关于java - Hibernate 和多次返回相同项目的条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19431021/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com