我房间里有一对多的亲戚。我需要获取数据列表,并将每个对象上的一个属性计算为金额之和。我能写一个查询吗?或者我必须迭代代码中的值?
更新
@Entity(tableName = "account_table")
class AccountModel(
@PrimaryKey(autoGenerate = true)
val id: Int = 0,
var name: String,
var bankNumber: String,
var amount: Double
)
@Entity(tableName = "spent_table")
data class SpentModel(
var amount: Double,
var title: String,
var description: String,
var date: String?,
var accountId: Int,
@PrimaryKey(autoGenerate = true)
val id: Int = 0,
)
data class AccountWithSpent(
@Embedded val account: AccountModel,
@Relation(
parentColumn = "id",
entityColumn = "accountId"
)
val spent: List<SpentModel>
)AccountWithSpent是我的数据的一个到多个关系,我希望从使用中获取所有的金额,并将其存储到帐户对象数量属性中。
发布于 2021-06-25 22:06:33
我可以为此写一个查询吗?
是
或我必须迭代代码中的值吗?
不,但你可以。。
尽管可能有用的内容,但Additional/Correction备注,您可能希望直接到底部阅读部分。
假设您想要获取检索一个或多个AccountWithSpent对象时所花费的金额之和,那么您可以在AccountWithSpent中包含一个val/字段,例如:-
data class AccountWithSpent(
@Embedded val account: AccountModel,
@Relation(
parentColumn = "id",
entityColumn = "accountId"
)
val spent: List<SpentModel>,
val sumOfSpent: Double /*<<<<< ADDED for SUM*/
)然后您可以进行如下查询:-
@Transaction
@Query("SELECT *, (SELECT sum(spent_table.amount) FROM spent_table WHERE spent_table.accountId = a.id) AS sumOfSpent FROM account_table AS a")
fun getAccountWithSpent(): List<AccountWithSpent>AS sumOfSpent很重要,它将获取数据的列命名为POJO中字段的相同名称,当id列用于子查询((SELECT sum(spent_table.amount) FROM spent_table WHERE spent_table.accountId = a.id)) 强制使用account_table
您还可以进行如下查询:
@Transaction
@Query("SELECT account_table.*, sum(spent_table.amount) AS sumOfSpent FROM account_table JOIN spent_table ON account_table.id = spent_table.accountId GROUP BY account_table.id")
fun getAccountWithSpentV2(): List<AccountWithSpent>account_table.*用于定义输出列(即仅来自帐户表的列),替代
如果您只想使用Sum而不是底层已使用对象的列表,则可以使用以下内容:-
data class AccountWithSumOfSpent(
@Embedded
val account: AccountModel,
val sumOfSpent: Double
)与:-
@Query("SELECT *, sum(spent_table.amount) AS sumOfSpent FROM account_table JOIN spent_table ON account_table.id = spent_table.accountId GROUP BY account_table.id")
fun getAccountWithSumofSpent(): List<AccountWithSumOfSpent>不需要
@Transaction,因为所有数据都是由单个查询提取的。
- the subquery is embedded in the main query. However, when using @Relation Room builds and executes queries in addition to the main query and hence why it warns about using `@Transaction`使用这两种方法的工作示例
/* ADD 1 Account with 3 Spends (totalling $100.00) */
val account1Id = dao.insert(AccountModel(0,"BANKX","000000",0.00)).toInt()
dao.insert(SpentModel(30.00,"SPEND1","BUYA","2021-06-25",account1Id))
dao.insert(SpentModel(30.00,"SPEND2","BUYB","2021-06-24",account1Id))
dao.insert(SpentModel(40.00,"SPEND3","BUYC","2021-06-23",account1Id))
/* Extract and Log using first method (Account, with Sum and with all Spends) */
for(a: AccountWithSpent in dao.getAccountWithSpent()) {
Log.d("ACCNTINFO","Account Name is ${a.account.name} Bank Number is ${a.account.bankNumber} SUM of Spend is ${a.sumOfSpent}")
//Log.d("ACCNTINFO","Account Name is ${a.account.name} Bank Number is ${a.account.bankNumber}")
for(s: SpentModel in a.spent) {
Log.d("ACCNTINFO","Title is \t${s.title} Description is ${s.description} Date is ${s.date} Amount is ${s.amount}")
}
}
/* Extract and Log using second method (no Spends) */
for(a: AccountWithSumOfSpent in dao.getAccountWithSumofSpent()) {
Log.d("ACCNTINFO", "Account Name is ${a.account.name} Bank Number is ${a.account.bankNumber} SUM of Spend is ${a.sumOfSpent}")
}结果
日志包括:-
2021-06-26 07:58:55.265 D/ACCNTINFO: Account Name is BANKX Bank Number is 000000 SUM of Spend is 100.0
2021-06-26 07:58:55.265 D/ACCNTINFO: Title is SPEND1 Description is BUYA Date is 2021-06-25 Amount is 30.0
2021-06-26 07:58:55.265 D/ACCNTINFO: Title is SPEND2 Description is BUYB Date is 2021-06-24 Amount is 30.0
2021-06-26 07:58:55.265 D/ACCNTINFO: Title is SPEND3 Description is BUYC Date is 2021-06-23 Amount is 40.0
2021-06-26 07:58:55.268 D/ACCNTINFO: Account Name is BANKX Bank Number is 000000 SUM of Spend is 100.0Additional/Correction
,我需要获取数据列表,并将每个对象上的一个属性计算为金额之和。AccountWithSpent是我的数据的一个到多个关系,我希望从使用中获取所有的金额,并将其存储到帐户对象数量属性中。
我没有正确地阅读上面的内容,所以根据您的原始AccountWithSpent,您可以使用:-
@Transaction
@Query("SELECT account_table.id,account_table.name, account_table.bankNumber, sum(spent_table.amount) AS amount FROM account_table JOIN spent_table ON account_table.id = spent_table.accountId GROUP BY account_table.id")
fun getAccountWithSpent(): List<AccountWithSpent>并且将相应地填充AccountModel的金额。
但是,应该注意的是,数据库中的数量仍将是原来的,不会改变。一个反问句,你是否需要保存在数据库中的金额,因为它总是可以计算的?
也许AccountModel有:-
.....
@Ignore
var amount: Double如果您想要数据库中的金额,那么也许您应该始终维护数据库中的金额。如果是这样的话,那么您可能会考虑在支出被添加/删除或更新时使用触发器来自动调整金额(如果是这样的话,那将是另一个问题)。
https://stackoverflow.com/questions/68133972
复制相似问题