我做了一個應用程序使用貨幣插件來表示錢,它介紹了3個域的類,Money
,Currency
和ExchangeRate
。最好的方法來幫助貨幣插件的性能做計算時
這裏的Money
域類:
只是爲了更容易解釋的緣故,讓剛剛說我有2類: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
計算總
(因爲exchangeRate和貨幣都包含在每個Money對象中):
我可以有一筆錢被定義爲「金額:25,貨幣:美元」,另一個「金額:500,貨幣:日元」,如果我只是查詢金額部分,結果將被關閉,因爲它不將貨幣轉換爲同一個貨幣。
,我被迫在SalesOrder
貫穿每一個OrderItem
循環,你可以想像表現得如此糟糕,我花了近18秒,一共拿到了30 SalesOrder
秒。 (在SalesOrder的靜態映射中添加「orderItems fetch:'join'」後,我可以將其降低到9秒,但9秒仍然太多)
這個插件不是很流行,如果有人遇到類似這樣的事情,那麼如果你有處理這類問題的經驗,請幫助我。
謝謝
因爲貨幣/匯率是參與,不是所有的錢保存在同一貨幣的伎倆,轉換有以前不同的貨幣每款物進行。 我本來可以保存一張「25美元」和一張「5000日元」,如果您只是簡單地查詢金額,總數就會大大減少。 – 16dots
好的,我明白了。我會添加一個新字段來存儲一種貨幣的價格,比如在'$'中,並通過在$'中重新計算來保存所有其他貨幣值。因此,您可以隨時獲得美元數額並將其重新計算爲目標貨幣。這並不簡單,但你幾乎沒有其他選擇 – injecteer