【发布时间】:2019-08-21 08:31:09
【问题描述】:
我在 Android 上使用 Room 来查询 POJO。
我的 POJO(事务)包含一个 value 和一个 account_id。它还包含一个account(帐户实例),由@Relation 获取。
事务类:
@Parcelize
class Transaction(
@Embedded val entity: TransactionEntity,
@Relation(entity = Account::class, parentColumn = Database.Transactions.COL_ACCOUNT_ID, entityColumn = Database.Accounts.COL_ID) val account: Account? = null
) : Model
帐户属性:
data class Account(
@PrimaryKey(autoGenerate = true) @ColumnInfo(name = Database.Accounts.COL_ID) val id: Long = 0,
@ColumnInfo(name = Database.Accounts.COL_NAME) val name: String = "",
@ColumnInfo(name = Database.Accounts.COL_BALANCE) val balance: Double = 0.0
)
accounts.balance 不是数据库中的值,而是属于该帐户的所有 transactions.value 的总和。
所以我需要对每个transaction.value 求和,其中transaction.account_id = account.id。
它应该与这种方式类似,但我没有做对:
@androidx.room.Transaction
@Query(
"""
SELECT transactions.* FROM transactions
LEFT OUTER JOIN (SELECT transactions.value, SUM(transactions.value) AS balance FROM accounts) ON transactions.account_id = accounts.id
GROUP BY transactions.id
"""
)
fun getTrs(): List<Transaction>
【问题讨论】:
-
LEFT JOIN(而不是INNER JOIN)的原因是什么? -
假设您想要一个已知帐户的余额,为什么不简单地
select sum(t.value) from transactions t where t.id = 'myknownaccounid'呢? -
如果你想要一些全球性的东西。
select t.id, sum(t.value) from transactions group by t.id; -
我不需要关节。
-
@Tuckbros 抱歉回答迟了,我想要一个 Account 对象,其中包含相关交易的总和/余额。这就是我认为需要 JOIN 的原因。
标签: android sql sqlite android-sqlite android-room