Java Hibernate和多次返回相同项的条件

Java Hibernate和多次返回相同项的条件,java,hibernate,Java,Hibernate,我有“学生”和“班级”的关系。中间有一个链接表 Criteria crit = getSession().createCriteria(Student.getClass()); return crit.list(); 如果我想通过以下方式检索所有使用HQL的学生,一切都很好: Query queryObject = getSession().createQuery("from Student"); return queryObject.list(); 使

我有“学生”和“班级”的关系。中间有一个链接表

Criteria crit =  getSession().createCriteria(Student.getClass());        
return crit.list();
如果我想通过以下方式检索所有使用HQL的学生,一切都很好:

Query queryObject = getSession().createQuery("from Student");
return queryObject.list();          
使用上面的代码,如果有三个学生,我会得到三个学生的列表

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

Criteria crit =  getSession().createCriteria(Student.getClass());        
return crit.list();
对于第二个代码,我只在链接表为空时得到三个结果。然而,当我添加一个关联时,我得到6个结果。查看日志,Hibernate会生成多个选择。怎么可能呢

有人能解释为什么会这样吗?如何修正条件,以便只返回三条记录一次

编辑

在学生课堂上,我以这种方式映射:

@ManyToMany(fetch=FetchType.EAGER)
@JoinTable(
    name="room_student_rel"
    , joinColumns={
        @JoinColumn(name="id_student")
        }
    , inverseJoinColumns={
        @JoinColumn(name="id_room")
        }
    )
private List<Room> rooms;
@ManyToMany(fetch=FetchType.EAGER)
@可接合(
name=“房间\学生\关系”
,连接柱={
@JoinColumn(name=“id\u学生”)
}
,反向连接列={
@JoinColumn(name=“id\u房间”)
}
)
私人名单室;
在我以这种方式映射的房间(类):

@OneToMany(fetch=FetchType.EAGER,  mappedBy="room")
@Fetch(FetchMode.SELECT)
private List<RoomStudent> roomStudents;
@OneToMany(fetch=FetchType.EAGER,mappedBy=“room”)
@Fetch(FetchMode.SELECT)
私人学生名单;

要展开我之前的评论,Hibernate将在FetchType设置为“渴望”时尝试使用外部联接进行选择

见以下第2.2.5.5节:

有关这一点的含义,请参见此处:

现在,您还可以指定一个FetchMode(在您的criteria
.setFetchMode(“assocfield”,FetchMode.LAZY)
)来将其设置为JOIN以外的内容,或者您可以使用类似于
criteria.setResultTransformer(criteria.DISTINCT\u ROOT\u ENTITY)的内容
以过滤重复项


理想情况下,您应该避免在实体映射上使用EAGER,如果需要使用EAGER fetching,请使用一些提示或通过FetchProfile在实体加载时显式启用它,然后在需要时处理重复项。

要扩展我之前的注释,Hibernate将在FetchType设置为EAGER时尝试使用外部联接进行选择

见以下第2.2.5.5节:

有关这一点的含义,请参见此处:

现在,您还可以指定一个FetchMode(在您的criteria
.setFetchMode(“assocfield”,FetchMode.LAZY)
)来将其设置为JOIN以外的内容,或者您可以使用类似于
criteria.setResultTransformer(criteria.DISTINCT\u ROOT\u ENTITY)的内容
以过滤重复项


理想情况下,您应该避免在实体映射上使用EAGER,如果需要使用EAGER fetching,请使用一些提示或通过FetchProfile在实体加载时显式启用它,然后在需要时处理重复项。

要扩展我之前的注释,Hibernate将在FetchType设置为EAGER时尝试使用外部联接进行选择

见以下第2.2.5.5节:

有关这一点的含义,请参见此处:

现在,您还可以指定一个FetchMode(在您的criteria
.setFetchMode(“assocfield”,FetchMode.LAZY)
)来将其设置为JOIN以外的内容,或者您可以使用类似于
criteria.setResultTransformer(criteria.DISTINCT\u ROOT\u ENTITY)的内容
以过滤重复项


理想情况下,您应该避免在实体映射上使用EAGER,如果需要使用EAGER fetching,请使用一些提示或通过FetchProfile在实体加载时显式启用它,然后在需要时处理重复项。

要扩展我之前的注释,Hibernate将在FetchType设置为EAGER时尝试使用外部联接进行选择

见以下第2.2.5.5节:

有关这一点的含义,请参见此处:

现在,您还可以指定一个FetchMode(在您的criteria
.setFetchMode(“assocfield”,FetchMode.LAZY)
)来将其设置为JOIN以外的内容,或者您可以使用类似于
criteria.setResultTransformer(criteria.DISTINCT\u ROOT\u ENTITY)的内容
以过滤重复项



理想情况下,您应该避免在实体映射上使用EAGER,如果需要使用EAGER抓取,请使用一些提示或通过FetchProfile在实体加载时显式启用它,然后在需要时处理重复项。

6个结果是什么?你能显示multiple select吗?我感觉这会得到错误的数据,因为映射中存在错误,而不是因为标准中缺少某些东西。您能为多对多映射添加代码吗?-我会把我的钱放在注释中缺少的
mappedBy
属性中。如果您添加了关联,您在db中的表中有多少行?Augusto。。。在学生类中,我以这种方式映射:@manytomy(fetch=FetchType.EAGER)@JoinTable(name=“room\u Student\u rel”,joinColumns={@JoinColumn(name=“id\u Student”)},inverseJoinColumns={@JoinColumn(name=“id\u room”)}私有列表房间;在房间(类)中,我这样映射:@OneToMany(fetch=FetchType.EAGER,mappedBy=“room”)@fetch(FetchMode.SELECT)private List roomStudents;上面我以可读的方式添加了信息,6个结果是什么?你能显示multiple select吗?我感觉这会得到错误的数据,因为映射中存在错误,而不是因为标准中缺少某些东西。您能为多对多映射添加代码吗?-我会把我的钱放在注释中缺少的
mappedBy
属性中。如果您添加了关联,您在db中的表中有多少行?Augusto。。。在学生类中,我以这种方式映射:@manytomy(fetch=FetchType.EAGER)@JoinTable(name=“room\u Student\u rel”,joinColumns={@JoinColumn(name=“id\u Student”)},inverseJoinColumns={@JoinColumn(name=“id\u room”)}私有列表房间;在房间(类)中,我这样映射:@OneToMany(fetch=FetchType.EAGER,mappedBy=“room”)@fetch(FetchMode.SELECT)private List roomStudents;上面我以可读的方式添加了信息