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 的列表
我发布这个是因为 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 的列表