如何按Course属性过滤Room ManyToMany关联的复合POJO?
问题原因
- 多表JOIN后使用
SELECT *返回结果存在重名字段:id、name在Teacher和Course表中都存在,导致Room解析@Embedded注解的Teacher实体时,主键id被后续Course表的同名字段覆盖,拿到了错误的Teacher ID,Room用错误ID关联查询Course自然返回空列表。 - 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
相关产品推荐
相关产品推荐

