Room Android 忽略 Dao class 中的@Query 条件(奇怪)

Room Android ignores @Query conditions in Dao class (Strange)

我发布这个是因为 Whosebug 上已经存在同样的问题,但没有解决方案。我正在使用 Room 库进行数据库操作。我已经用 @Embedded@Relation 和其他表创建了数据 classes。现在的问题是,当我在主表和连接表上放置具有多个 where 条件的连接查询时,它 returns all/incorrect 连接表的数据。这表明它忽略了我在 DAO class 查询中设置的条件。重要的是,当我 运行 在外部数据库上执行相同的查询(在 chrome 中使用 stetho)时,它会按预期工作。请帮我解决这个问题,因为这是非常关键的问题。房间版本:2.4.0

这是数据class:

data class ProductFull{
    @Embedded val product: ProductMaster,

    @Relation(
        entity = ProductZone::class,
        parentColumn = "productId",
        entityColumn = "productId",
    )
    var productZone: ProductZone? = null,
}

这是 DAO class 方法:

@Query("select * from ProductMaster as pm inner join ProductZone as pz on pz.productId = pm.productId where pz.zoneId = 3")
    abstract suspend fun getTempProducts(): List<ProductFull>

以上查询 returns 数据 class 的 productZone 字段中的数据具有 zoneId = 1。而它应该只有 return 个具有 zoneId = 3 的区域。

当使用 @Relation room 构建基础查询时,为每个 parent (ProductMaster) 获取 ALL children (ProductZones) ) 查询选择。

A convenience annotation which can be used in a POJO to automatically fetch relation entities. When the POJO is returned from a query, all of its relations are also fetched by Room. https://developer.android.com/reference/kotlin/androidx/room/Relation

A get-around 是两个有 2 个 dao 的,一个选择 parents,另一个选择所需的 children 和一个函数(使用抽象 class而不是 Dao 的接口)使用第一个查询获取 parent,然后每个 parent 使用第二个查询获取所需的 children。

该函数应使用 @Transaction 注释,以允许也使用 @Query("")

对其进行注释

你会想要这样的东西:-

@Transaction
@Query("SELECT * FROM productmaster JOIN productzone on productmaster.productId = productzone.productId WHERE productzone.zoneId = 3")
abstract fun getTempProducts(): List<ProductFull>

@Query("SELECT * FROM productzone WHERE productId=:productId AND zoneId=3")
abstract fun getTempZone(productId: Long): ProductZone

@Transaction
@Query("")
fun buildFullProducts(): List<ProductFull> {
    var rv = getTempProducts()
    for (pf: ProductFull in rv) {
        pf.productZone = getTempZone(pf.product.productId!!)
    }
    return rv
}

并使用 buildFullProducts 函数检索 ProductFull 的列表