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

3

我有两个实体:GradeStudentStudent有一个指向教室的外键。嵌入式实体ClassRoom如下所示:

data class ClassRoom(

    @Embedded
    val level: ClassLevel

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

    // val strength: Int ?

) 

我要达到的目标是使用ClassRoomInstance.strength获取传入外键的计数。然后使用students.size计算学生的大小。如何实现这个目标?谢谢。

请将所有的“Entity”类文件添加到此上下文中。同时添加“Dao”也会很有帮助。谢谢! - Karan Dhillon
2个回答

10
你能创建一个返回学生人数的查询。
考虑以下POJO,一个电影和预告片。
@Entity
data class Movie(
    @PrimaryKey
    val id: Int,
    val title: String,
    val overview: String
)

@Entity
data class Trailer(
    @PrimaryKey
    val id: Int,
    val movieId: Int,
    val trailerPath: String
)

假设我想获取电影及其预告片数量

data class MoviesWithTrailerCount(
    @Embedded
    val movie: Movie,
    val trailerCount: Int
)

在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

所以,基本上你想要实现的可以通过使用SQL查询和@Embedded来完成。


谢谢,如果我想要一个带有预告片计数的所有电影列表怎么办? - user3348051
你需要将 moviesAndTrailersCount 的返回类型改为 List 或 Flow<List>,并且删除 where 条件。 - João Paulo Sena
2
我不得不修改查询语句,以便让它返回所有电影并包括计数(*)返回0的情况,但是你的确很有帮助,这是我的查询语句:SELECT M.*, COUNT(T.id) AS trailerCount FROM Movie M LEFT JOIN Trailer T ON T.movieId = M.id GROUP BY M.id - karique
我正在提取一个带有计数的项目列表,因此我删除了WHERE子句并切换到LEFT JOIN。但是由于有多个记录,我还必须添加GROUP BY M.id。谢谢。 - thefallen

0
尝试将这个查询添加到你的Dao中,参考谷歌的示例。
@Query("SELECT COUNT(column) FROM table")
int getDataCount();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接