You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多对多关联下,如何用Criteria查询归属ID为2的Teacher的Student列表?

查询归属指定Teacher的Student列表(Hibernate Criteria实现)

这问题我太熟了,不用特意去映射中间表STUDENT_TEACHER,Hibernate的Criteria API直接就能通过实体间的多对多关联来过滤数据,咱们直接上方案:

方法1:使用createAlias关联Teacher集合

// 创建Student的查询Criteria
Criteria criteria = session.createCriteria(Student.class);
// 关联Student的teachers集合,取别名t方便后续条件查询
criteria.createAlias("teachers", "t");
// 添加过滤条件:关联的Teacher ID等于2
criteria.add(Restrictions.eq("t.id", 2));
// 关键:设置结果转换器去重,避免多对多关联导致的重复Student实例
criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);

// 执行查询得到目标Student列表
List<Student> studentList = criteria.list();

方法2:使用createCriteria创建子查询

如果习惯用子Criteria的写法,也可以这么做:

Criteria criteria = session.createCriteria(Student.class);
// 基于Student的teachers集合创建子Criteria
Criteria teacherSubCriteria = criteria.createCriteria("teachers");
// 在子Criteria中添加Teacher ID的过滤条件
teacherSubCriteria.add(Restrictions.eq("id", 2));
// 同样需要去重
criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);

List<Student> studentList = criteria.list();

额外提醒:修复双向多对多关联的配置

你的Teacher实体类里的@ManyToMany注解缺少mappedBy属性,这会导致Hibernate认为这是两个独立的多对多关联,可能生成多余的表或者出现关联维护问题。建议修改成这样:

@ManyToMany(mappedBy = "teachers") // 指定维护端为Student的teachers属性
private Collection<Student> students = new ArrayList<>();

这样双向关联的配置才是正确的,也能避免后续操作中出现的奇怪问题。

内容的提问来源于stack exchange,提问作者Yura

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:01:58