Grails Hibernate

时间:2014-03-11 19:13:00

标签: hibernate grails

有三个域对象.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)

  }
 }
}
}

2 个答案:

答案 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描述类似的hasManybelongsTo关联。