我使用currency插件创建了一个代表资金的应用,它引入了3个域类,Money
,Currency
和ExchangeRate
。
这是Money
域类:
为了便于解释,我们只说我有两个课程:SalesOrder
和OrderItem
。
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秒仍然太多了)
这个插件不是很受欢迎,所以我找不到任何人遇到这样的事情的情况,所以如果你有处理这类问题的经验,请帮助我。
由于
答案 0 :(得分:0)
为什么不呢?像
这样的东西def total = OrderItem.withCriteria( uniqueResult:true ){
projections{ sum 'price.amount' }
eq 'salesOrder', salesOrder
}
可以做到这一点