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

如何按Course属性过滤Room ManyToMany关联的复合POJO?

问题原因

  1. 多表JOIN后使用SELECT *返回结果存在重名字段:id、name在Teacher和Course表中都存在,导致Room解析@Embedded注解的Teacher实体时,主键id被后续Course表的同名字段覆盖,拿到了错误的Teacher ID,Room用错误ID关联查询Course自然返回空列表。
  2. Room的@Relation注解本身会基于父实体的主键自动执行子查询拉取关联数据,不需要手动JOIN子实体表,手动JOIN反而会引入不必要的字段冲突。

解决方案

修改getTeachersByCourseId方法的查询语句,仅查询Teacher表的字段,通过中间表过滤符合条件的Teacher即可,不需要JOIN Course表:

@Transaction
@Query("SELECT teacher.* FROM teacher " +
        "INNER JOIN teacherscourses AS tc ON teacher.id = tc.teacher_id " +
        "WHERE tc.course_id = :course_id " +
        "ORDER BY teacher.id ASC, tc.course_order ASC"
)
public abstract LiveData<List<TeacherWithCourses>> getTeachersByCourseId(short course_id);

额外注意的笔误

你定义的课程实体类名为Course,但TeacherWithCourses中关联列表写的是List<Courses>,多了后缀s,这个笔误也可能导致关联查询失败,需要修正为:

public List<Course> courses;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 14:24:03