我的Room数据库中有三个表,我的查询应该返回一个包含产品详细信息的产品列表。
所有产品都是基于documentId
插入的,因此当查询完成时,我需要在列表中仅该documentId
的项目。
DAO看起来像这样:
@Transaction
@Query("SELECT * FROM document_products dp LEFT JOIN products ON products.id = dp.productId LEFT JOIN products_barcodes ON products_barcodes.barcode = dp.productId WHERE dp.documentId = :documentId AND (products_barcodes.barcode = dp.productId OR products.id = dp.productId) ORDER BY timestamp ASC")
fun getProductsWithDetails(documentId: Long): Flow<List<DocumentProductWithDetails>>
如果我在这样的表中测试查询:
其中documentId
为5,查询将返回正确的值:
但这些值在应用程序中不正确,可能是DocumentProductWithDetails中@Relation的原因,但我无法找到问题所在,在应用程序内部的事实中,数据显示为:
因此,由于包含productId
的项目已保存三次,因此将显示最后一个项目,而不是与documentId
相关的项目
包含@Relation
注解的数据类如下所示:
@JsonClass(generateAdapter = true)
data class DocumentProductWithDetails(
@Relation(
parentColumn = "id",
entityColumn = "productId"
)
var product: DocumentProduct,
@Embedded
var details: ProductWithBarcodes?
)
记录产品和带条形码产品的位置:
data class DocumentProduct(
@PrimaryKey(autoGenerate = true)
var id: Long,
var productId: String,
var quantity: Float,
var orderQuantity: Float,
var purchase: Float,
var documentId: Long,
var labelType: String?,
var timestamp: Long?
)
data class ProductWithBarcodes(
@Embedded
var product: Product,
@Relation(
parentColumn = "id",
entityColumn = "productId"
)
var barcodes: List<Barcode>
)
1条答案
按热度按时间g2ieeal71#
因此,当具有productId的项保存三次时,它将显示最后一个项,而不是与documentId相关的项
如果查询的任何列具有相同的列名,则分配的值可能(将)不一致,因为重复名称的最后一列的值将是分配给具有相同名称的所有其它列的值(等等)。
我建议修复是使用唯一列名。例如,在条形码中使用列名而不是productId,更能指示值的使用,它可以被视为产品的Map,因此可能是barcode_productIdMap。
考虑你的第二个图像(带有一些标记):-
在本答复中,将通过示例对上述内容进行更详细的解释
正确的id、productId、quantity(* 修辞学 )是什么。
“房间”怎么会知道什么东西要去哪里呢?( 修辞学 *)
假设以下查询提取完全相同的数据(但数据列的顺序不同):
Room如何科普不同的顺序(正确的productId应该是第一个还是第二个(* 修辞学 *))。