请教个 android room 查询问题

magic3584 · 2025-2-17 18:06:14 · 213 次点击
data class AreaAndMedia(
    @Embedded
    val area: Area,
    @Relation(parentColumn = "objId" , entityColumn = "bindArea")
    var medias: List<Media>
)

data class Media(
	@ColumnInfo(name = "taskId", defaultValue = "")
    val taskId: String = ""
)

interface Dao {
	@Transaction
    @Query("select * from area where objId = :areaId")
    fun selectAreaAndMediasById(areaId: String): 	Flow<List<AreaAndMedia>>
}

现在,我想新增一个查询方法,用意是过滤 Media ,例如

@Transaction
    @Query(
        "SELECT af.* FROM area af WHERE af.objId = :areaId AND EXISTS ( SELECT 1 FROM medias mi WHERE mi.bindArea = af.objId AND mi.taskId = '')"
    )
    fun selectAreaAndMediasWithEmptyTaskId(
        areaId: String
    ): Flow<List<AreaAndMedia>>

但是这个结果中,仍然包含 taskId 不为空的 Media, 不知道问题出在哪里

举报· 213 次点击
登录 注册 站外分享
1 条回复  
linhua 小成 2025-2-17 19:04:24
你的问题在于 @Relation 注解的使用方式。 @Relation 注解会自动加载所有与 parentColumn 匹配的 entityColumn 的记录,而不会考虑你在 @Query 中对 Media 表的过滤条件。因此,即使你在 @Query 中使用了 EXISTS 子句来过滤 Media ,@Relation 仍然会加载所有关联的 Media 对象。 https://stackoverflow.com/questions/49005681/room-relations-with-conditions
返回顶部