Grails 帮助货币插件的最佳方式';做计算时,它的性能如何
我使用货币插件制作了一个应用程序来表示货币,它引入了3个域类,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
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秒的时间才得到30SalesOrder
的总数。(在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
}