Android Room内部联接选择多行

时间:2020-01-21 14:21:55

标签: android mysql sql kotlin android-room

我正在Android Room中使用以下查询从与外键相关的两个表中获取值。 ItemTransaction与列upc相关的外键。 unique_id是唯一的交易号。

 @Query("SELECT * FROM Transaction t INNER JOIN Item i ON i.upc=t.item_upc WHERE t.unique_id=:uniqueId")
    LiveData<List<TransactionItem>> getTransactionItemsByUID(@NonNull final String uniqueId);

当我使用唯一的事务ID运行此命令时,无论Transactions子句如何,查询都会选择upcWHERE相同的所有行。基本上,选择具有不同unique_id的事务。但是,我只对与unique_id完全匹配的行感兴趣。

TransactionItem类的定义如下。

// TransactionItem Model

@Embedded
public ItemModel itemModel;

@Relation(parentColumn = "upc", entityColumn = "item_upc", entity = Transaction.class)
public List<Transaction> transactions;

我花了两天的时间进行谷歌搜索和阅读,但仍然找不到正确的解决方案。我在这里俯瞰什么?

1 个答案:

答案 0 :(得分:1)

您告诉通过INNER JOIN获取Transaction和Item,然后通过@Relation JOIN(没有WHERE)获取由Transaction获得的Item的TransactionItem列表。

您要获取“交易”和“项目”而不是“交易项目”列表,因此,TransactionItem不正确。您想要@Embedded Transaction和@Relation与ItemModel一样

@Embedded
public Transaction transaction;
@Relation(parentColumn = "item_upc", entityColumn = "upc", entity = ItemModel.class)
public ItemModel itemModel; 

仅猜测1个项目。可以根据需要执行public List<Item> itemModels

您使用

@Transaction
@Query("SELECT * FROM Transaction WHERE unique_id=:uniqueId")
LiveData<List<TransactionItem>> getTransactionItemsByUID(@NonNull final String uniqueId);