2013-03-20 61 views
3

我在尋找一些Grails的在我的當前項目格姆代碼,我想知道什麼是下面的HQL方法的一些優點和缺點:時使用的executeUpdate Grails中

UploadUpsell.executeUpdate("update UploadUpsell set processedStatus=:newStatus, processedDate=:processedDate where processedDate is null and period=:period", 
          [newStatus: EXPIRED_UPSELL_STATUS, processedDate: new Date(), period: flow.period]) 

我會去沿着線更地道的做法

UploadUpsell.findAllByPeriodAndProcessedDate(flow.period, null).each { UploadUpsell uploadUpsell -> 
        uploadUpsell.with { 
         processedStatus = EXPIRED_UPSELL_STATUS 
         processedDate = new Date() 
         save() 
        } 
       } 

我相信,我的做法是更容易測試,更可讀的,但我想知道如果我的想法只是教條

HQL ST據我所知,grails嘲笑框架不支持atements。

回答

4

您的方法更具可讀性,但性能遠遠不夠。將所有實例讀入內存,包括不會更改的數據,進行更改並將所有內容都推回到數據庫,包括未更改的值。如果你的域類和它們的值很小,這不是什麼大問題(特別是如果記錄數量不是很大),但總的來說這種方法是一個可伸縮性問題。

通過使用executeUpdate直接運行查詢,您可以讓數據庫執行其擅長的操作 - 它可以找到需要更新的記錄,並完成數據庫與Web服務器之間所有不必要的流量的工作。

你說得對,單元測試不支持HQL,但你不應該單元測試域類。如果你不測試數據庫的持久性,你所測試的只是模擬框架。

+0

嗯,我的意思是嘲笑領域類,即不測試框架 – barrymac 2013-03-20 18:05:14

+0

這裏只涉及大約10個20條記錄,但即使如此,仍然有可能將事務中的調用包裝爲僅創建一個單一查詢相同? – barrymac 2013-03-20 18:07:14

+2

在事務中包裝查詢不會改變查詢的數量。 – codelark 2013-03-20 18:34:10