我正在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>
答案 0 :(得分:0)
尝试一下:
@androidx.room.Transaction
@Query(
"""
SELECT transactions.* FROM transactions
LEFT OUTER JOIN (SELECT transactions.value, SUM(transactions.value) AS balance FROM accounts GROUP BY transactions.id) ON transactions.account_id = accounts.id
"""
)
fun getTrs(): List<Transaction>
答案 1 :(得分:0)
您已在GROUP BY子句中列出了表事务的所有必要列。
SELECT transactions.* SUM(transactions.value) AS balance
FROM transactions
LEFT JOIN accounts ON transactions.account_id = accounts.id
GROUP BY ...transactions.id, transactions.account_id.... and all necessary columns of transactions table...
希望我能帮助您!
答案 2 :(得分:0)
您可以使用子查询:
SELECT t.*,(SELECT SUM(transactions.value) FROM accounts a ON t.account_id = a.id) AS balance
FROM transactions t
答案 3 :(得分:0)
使其清洁: 首先创建余额视图
CREATE VIEW v_balance AS
SELECT account_id, SUM(value) as account_balance
FROM transactions
GROUP BY account_id
然后根据需要在左联接中使用该视图:
SELECT account.*, IFNULL(v_balance.account_balance, 0.0)
FROM account
LEFT JOIN v_balance ON v_balance.account_id = account.id
答案 4 :(得分:0)
可能是这样的意思:
SELECT a.*, SUM(t.value) AS balance
FROM transactions t
LEFT JOIN accounts a
ON a.account_id = t.account_id
GROUP BY t.account_id
答案 5 :(得分:0)
我通过创建一个包装原始帐户对象的新POJO来做到这一点,但为现在要查询的总和添加了一个字段。
@Query(
"""
SELECT accounts.*,
(SELECT SUM(CASE WHEN transactions.type = ${Transaction.TransactionType.EARNING} THEN transactions.value
ELSE -transactions.value END) FROM transactions WHERE transactions.account_id = accounts.id) AS balance
FROM accounts
LEFT JOIN transactions ON transactions.account_id = accounts.id
GROUP BY accounts.id
"""
)
fun getAccountsWithBalance(): LiveData<List<AccountWithBalance>>