多对多关联下,如何用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
相关产品推荐
相关产品推荐

