有三个域对象.Person有多个关联,关联有多个事务。
class Person implements Serializable{
static hasMany = [associations: Association]
static mappedBy = [associations: 'personId']
}
class Association implements Serializable{
static hasMany = [transactions: Transaction]
static mappedBy = [transactions: 'association']
}
class Transaction implements Serializable{
.....
}
Person has multiple Associations and Associations has multiple Transactions
def personsList = []
def personList= []
def p = Person.createCriteria()
personList= p.listDistinct {
order('personName','asc')
eq("personType", "A")
eq("statusFlag", "A")
associations {
order('legalName', 'asc')
transactions {
isNull('remittance_trx_id')
isNull('cancelDate')
between('paymentDate', flow.startDate, flow.endDate)
or {
eq('ufPayStatus', "AT")
eq('ufPayStatus', "RT")
}
gt('ufBaseFee', 0.00)
}
}
}
在我尝试迭代事务对象获取结果列表后,它正在为每个关联id执行多个数据库查询。如何避免这种情况?这是在迁移最新版本之后发生的。它会影响性能并获得超时异常。
personList {person - >
person.associations.each {association ->
association.transactions.each {transaction ->
BigDecimal c = new BigDecimal(transaction.ufBaseFee)
personTotal= personTotal.add(c)
}
}
}
}
答案 0 :(得分:0)
您在这里看到的是Lazy加载集合的N + 1选择问题。您可能希望使用eager fetching调查您的收藏。
class Person implements Serializable{
static hasMany = [associations: Association]
static mappedBy = [associations: 'personId']
static fetchMode = [associations: 'eager']
}
class Association implements Serializable{
static hasMany = [transactions: Transaction]
static mappedBy = [transactions: 'association']
static fetchMode = [transactions: 'eager']
}
答案 1 :(得分:0)
这听起来像Grails中的常见问题。 Burt Beckwith就此发表了演讲。
一种解决方案是摆脱与this site描述类似的hasMany
和belongsTo
关联。