使用房间关系在房间数据库中进行三重连接



我需要在room中使用@relation注释来三重连接我的实体,但是我不知道怎么做。

以下是我对实体的总结:

@Entity(tableName = "session_table")
data class Session(
@PrimaryKey(autoGenerate = true)
var sessionId: Long = 0L,
@ColumnInfo(name = "lesson_id")
var lessonId: Long
)
@Entity(tableName = "lessons_table")
data class Lesson(
@PrimaryKey(autoGenerate = true)
val lessonId: Long,
@ColumnInfo(name = "teacher_id")
var teacherId: Long = -1L
)
@Entity(tableName = "teacher_table")
data class Teacher(
@PrimaryKey(autoGenerate = true)
val teacherId: Long = 0L
) 

我想答案应该是这样的:

data class SessionWithLessonWithTeacher(
@Embedded
val session: Session,
@Relation(
parentColumn = "lesson_id",
entityColumn = "lessonId"
)
var lesson: Lesson,
@Relation(
parentColumn = "teacher_id", // this is the teacher id in lesson
entityColumn = "teacherId",
)
var teacher: Teacher
)

你对SessionWithlessonWithTeacher应该是什么的猜测是行不通的,因为它实际上是在说从Session中得到teacher_id。会话中没有teacher_id

要使用@Relation's,那么你需要遵循层次结构。一节课有一节课,一节课有一位老师。所以在会话中,你需要得到一个老师的教训。

这样有(通过层次结构向上):-

data class LessonWithTeacher(
@Embedded
val lesson: Lesson,
@Relation(
entity = Teacher::class,
parentColumn = "teacher_id",
entityColumn = "teacherId")
val teacher: Teacher
)

data class SessionWithLessonWithTeacher(
@Embedded
val session: Session,
@Relation(
entity = Lesson::class, /* NOTE Lesson  NOT LessonWithTeacher (not a table) */
parentColumn = "lesson_id",
entityColumn = "lessonId")
val lessonWithTeacher: LessonWithTeacher
)

您可以使用@Dao,例如:-

@Query("SELECT * FROM session_table")
@Transaction
abstract fun getSessionWithLessonWithTeacher(): List<SessionWithLessonWithTeacher>

替代方法

Room使用@Relation的方式是它最初只检索嵌入式对象,然后通过后续查询检索所有@Related对象,因此它警告(期望)@Transaction。

对于您的场景,每个会话有一节课,每节课有一位老师,您可以嵌入这三个表,并使用一个查询(尽管它更复杂)将三个表连接起来。

因此,代替(或同时)SessionWithLessonWithTeacher,您可以使用:-

data class SessionLessonTeacher(
@Embedded
val session: Session,
@Embedded
val lesson: Lesson,
@Embedded
val teacher: Teacher
)
  • 注意@Embedded如果在嵌入对象之间列名不是唯一的就会很麻烦

对应的查询可以是:-

@Query("SELECT * FROM session_table " +
"JOIN lessons_table ON lessons_table.lessonId = session_table.lesson_id " +
"JOIN teacher_table ON teacher_table.teacherId = lessons_table.teacher_id")
abstract fun getSessionLessonTeacher(): List<SessionLessonTeacher>
  • 注意,在您的示例中,表。column可以只是column,因为列名都是唯一的。

最新更新