Android Room 获取“嵌入实体”中“传入外键列表”中的元素数量?

3 java android kotlin android-room android-room-relation

我有 2 个实体,并且Grade有一个通往教室的外键。嵌入式实体看起来像这样,StudentStudentClassRoom

data class ClassRoom(

    @Embedded
    val level: ClassLevel

    @Relation(
        parentColumn = "id",
        entityColumn = "ClassLevel"
    )
    val students: List<Student>,

    // val strength: Int ?

) 
Run Code Online (Sandbox Code Playgroud)

我想要实现的是,使用ClassRoomInstance.strength来获取传入外键的计数。比计算学生的规模students.size

达到这个目的的方法是什么?

谢谢

小智 11

您可以创建一个返回学生人数的查询。

考虑以下 POJO、电影和预告片

@Entity
data class Movie(
    @PrimaryKey
    val id: Int,
    val title: String,
    val overview: String
)
Run Code Online (Sandbox Code Playgroud)
@Entity
data class Trailer(
    @PrimaryKey
    val id: Int,
    val movieId: Int,
    val trailerPath: String
)
Run Code Online (Sandbox Code Playgroud)

想象一下,我想要获得带有预告片数量的电影

data class MoviesWithTrailerCount(
    @Embedded
    val movie: Movie,
    val trailerCount: Int
)
Run Code Online (Sandbox Code Playgroud)

在 MovieDAO 中,我可以创建一个查询:

@Transaction
@Query("SELECT M.*, COUNT(T.id) AS trailerCount FROM Movie M INNER JOIN Trailer T ON T.movieId = M.id WHERE M.id = :id")
abstract suspend fun moviesAndTrailersCount(id: Int): MoviesWithTrailerCount
Run Code Online (Sandbox Code Playgroud)

所以,基本上你想要实现的目标可以使用 SQL 查询来完成@Embedded

  • 我必须修改查询以使其返回所有电影并包括 count(*) 返回 0 的情况,但你的确实很有帮助,这是我的: SELECT M.*, COUNT(T.id) AS TrailerCount FROM电影 M LEFT JOIN 预告片 T ON T.movi​​eId = M.id GROUP BY M.id (2认同)