Grails 帮助货币插件的最佳方式';做计算时,它的性能如何

Grails 帮助货币插件的最佳方式';做计算时,它的性能如何,grails,gorm,grails-domain-class,Grails,Gorm,Grails Domain Class,我使用货币插件制作了一个应用程序来表示货币,它引入了3个域类,money,Currency和ExchangeRate 以下是Money域类: 为了便于解释,让我们假设我有两个类:SalesOrder和OrderItem 销售订单: class SalesOrder { static hasMany = [orderItems:OrderItem] List<OrderItem> orderItems String customer

我使用货币插件制作了一个应用程序来表示货币,它引入了3个域类,
money
Currency
ExchangeRate

以下是
Money
域类:

为了便于解释,让我们假设我有两个类:
SalesOrder
OrderItem

销售订单:

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
       }

}
我们的目标是为每个
销售订单
获取一个总额,因为我认为我无法编写一个
的查询来计算总额

(因为每个货币对象都涉及汇率和货币):

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

,我被迫在
SalesOrder
中的每个
OrderItem
中运行循环,正如您可以想象的那样,性能非常差,我花了将近18秒的时间才得到30
SalesOrder
的总数。(在SalesOrder的静态映射中添加了“orderItems fetch:'join'”之后,我能够将这个时间降低到9秒。但是9秒仍然太多了)

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


谢谢

为什么不呢?差不多

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

可以做到这一点

因为涉及到货币/汇率,并非所有货币都保存在同一种货币中,因此必须对每个货币对象执行不同货币的转换。我本可以省下一个25美元和一个5000日元,如果你只是简单地查询一下金额,总数会减少很多。好的,我知道了。我会添加一个新字段来存储一种货币的价格,比如在
$
中,并通过在
$
中重新计算来保存所有其他货币值。因此,您始终可以获取美元金额并将其重新计算为目标货币。这不是很直截了当,但你几乎没有其他选择
def total = OrderItem.withCriteria( uniqueResult:true ){
  projections{ sum 'price.amount' }
  eq 'salesOrder', salesOrder
}