在计算时帮助货币插件的性能的最佳方法

时间:2014-02-21 14:45:40

标签: grails gorm grails-domain-class

我使用currency插件创建了一个代表资金的应用,它引入了3个域类,MoneyCurrencyExchangeRate

这是Money域类:

https://github.com/ricardojmendez/grails-currencies/blob/master/src/groovy/cr/co/arquetipos/currencies/Money.groovy

为了便于解释,我们只说我有两个课程:SalesOrderOrderItem

SalesOrder:

class SalesOrder {


       static hasMany = [orderItems:OrderItem]

       List<OrderItem> orderItems
       String customer
       def getTotal(){
           Money total = Money.getInstance("0 USD")
           orderItems.each{
                total+=it.getTotal()
           }
           total
       }

}

OrderItem的:

class OrderItem{



       static belongsTo = [salesOrder:SalesOrder]
       static embedded = ['price']

       Money price
       int quantity
       String itemName

       def getTotal(){
           price * quantity
       }

}

目标是获得每个SalesOrder的总计,因为我认为我不能为Money编写查询以计算总数

(因为每个Money对象都涉及exchangeRate和货币):

我可以有一笔定义为“金额:25,货币:美元”和另一笔“金额:500,货币:日元”的金额,如果我只查询金额部分,结果将会被取消,因为它不会将货币转换为同一货币。

,我被迫在OrderItem中的每个SalesOrder中运行循环,因为你可以想象表现非常糟糕我花了将近18秒来获得总计30 SalesOrder }}秒。 (在SalesOrder的静态映射中添加“orderItems fetch:'join'”之后我能够将其降低到9秒。但是9秒仍然太多了)

这个插件不是很受欢迎,所以我找不到任何人遇到这样的事情的情况,所以如果你有处理这类问题的经验,请帮助我。

由于

1 个答案:

答案 0 :(得分:0)

为什么不呢?像

这样的东西
def total = OrderItem.withCriteria( uniqueResult:true ){
  projections{ sum 'price.amount' }
  eq 'salesOrder', salesOrder
}

可以做到这一点