我發布這個是因為同樣的問題已經存在于 stackoverflow 上,但沒有解決方案。我正在使用 Room 庫進行資料庫操作。我已經使用@Embedded和@Relation與其他表創建了資料類。現在的問題是,當我在主表和連接表上放置具有多個 where 條件的連接查詢時,它回傳連接表的所有/不正確資料。這表明它忽略了我在 DAO 類查詢中設定的條件。重要的是,當我在外部資料庫上運行相同的查詢時(在 chrome 中使用 stetho),它按預期作業。請幫我解決這個問題,因為這是一個非常關鍵的問題。房間版本:2.4.0
這是資料類:
data class ProductFull{
@Embedded val product: ProductMaster,
@Relation(
entity = ProductZone::class,
parentColumn = "productId",
entityColumn = "productId",
)
var productZone: ProductZone? = null,
}
這是 DAO 類方法:
@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>
以上查詢回傳 zoneId = 1 的資料類的 productZone 欄位中的資料。而它應該只回傳 zoneId = 3 的區域。
uj5u.com熱心網友回復:
當使用@Relationroom 構建基礎查詢時,為查詢選擇的每個父級 (ProductMaster)獲取所有子級 (ProductZones)。
一個方便的注解,可以在 POJO 中使用以自動獲取關系物體。當查詢回傳 POJO 時,它的所有關系也由 Room 獲取。 https://developer.android.com/reference/kotlin/androidx/room/Relation
解決方法是兩個有 2 個 dao 的一個選擇父母,另一個選擇所需的孩子和一個函式(使用抽象類而不是 Dao 的介面)使用第一個查詢獲取父母,然后為每個父級使用第二個查詢獲取所需的子級。
該函式應該用 注釋@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 的串列
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/394256.html
