【发布时间】:2021-12-22 16:52:03
【问题描述】:
我有两个像这样的房间实体:
@Entity
public class Teacher implements Serializable {
@PrimaryKey(autoGenerate = true)
public int id;
@ColumnInfo(name = "name")
public String name;
}
@Entity
public class Course implements Serializable {
@PrimaryKey(autoGenerate = true)
public short id;
@ColumnInfo(name = "name")
public String name;
}
...还有一个像这样的多对多关系的联结表:
@Entity(primaryKeys = {"teacher_id", "course_id"})
public class TeachersCourses implements Serializable {
@ColumnInfo(name = "teacher_id")
public int teacherId;
@ColumnInfo(name = "course_id")
public short courseId;
@ColumnInfo(index = true, name = "course_order")
public short courseOrder;
}
...以及一些用于获取某种“复合 POJO”的复合类:
public class TeacherWithCourses implements Serializable {
@Embedded public Teacher teacher;
@Relation(
parentColumn = "id",
entity = Course.class,
entityColumn = "id",
associateBy = @Junction(
value = TeachersCourses.class,
parentColumn = "teacher_id",
entityColumn = "course_id"
)
)
public List<Courses> courses;
}
...那么,我有这种“复合DAO”:
@Dao
public abstract class TeacherWithCoursesDao {
[...]
// XXX This one works as expected
@Transaction
@Query("SELECT * FROM teacher " +
"WHERE id=:teacher_id"
)
public abstract LiveData<List<TeacherWithCourses>> getTeachersByTeacherId(int teacher_id);
// XXX FIXME
// This one succeeds at loading "parents", but each "parent"'s list of "children" is empty
@Transaction
@Query("SELECT * FROM teacher " +
"INNER JOIN teacherscourses AS tc ON teacher.id = tc.teacher_id " +
"INNER JOIN course AS c ON c.id = tc.course_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);
}
问题的重点是……
有效的会按预期返回列表:每个TeacherWithCourses 都有教师和List 的课程。第二个没有:生成的TeacherWithCourses 对象的Teacher 属性正确加载,但List<Courses> 属性有一个空列表,尽管基于INNER JOINS 的复杂SELECT 查询按预期过滤。
那么,我怎样才能获得完整的TeacherWithCourses 对象列表,就像在第一个 DAO 方法中一样,而是按课程 ID 进行过滤?
【问题讨论】:
标签: java android sql many-to-many android-room