2011-05-23 58 views
2

想象在grails中存在以下問題Grails中的非平凡數據查詢

您有某種具有數字屬性的審計跟蹤域類。例如,一個類中的Scrum項目的當前燒荒值寫入:

class burndown { 
    Date createDate 
    int value 
} 

你的項目中使用這個類在每次更新任務時存儲當前燃盡值 - 這意味着,每天數次。

現在你想繪製一個圖表,最後存儲的值爲每天

對此的SQL語句可能看起來像

select 
    * 
from 
    table 
where 
    id in (
    select 
     max(id) 
    from 
     table 
    group by 
     TO_CHAR(create_date,'yyyyddmm') 
) 

現在我的問題:你是怎麼做的Grails中這樣的查詢?

如果我必須使用這樣的SQL語句,我該如何避免將表名和列名硬編碼到語句中?

PS:此代碼尚未經過測試。只是寫下來從我的腦海...但我猜你覺得我想問

+1

你可能的意思是:'(從表組中選擇max(id)by ...)',對吧? – 2011-05-23 19:51:53

+1

btw:我知道,我應該聚合另一個表中的數據,以免遇到性能問題... – rdmueller 2011-05-23 19:54:24

+0

沒錯。最大(id) - thanx! – rdmueller 2011-05-23 19:55:32

回答

3

對你最有可能要重新命名createDatedateCreated,因爲它是你的Grails的自動設置,如果你使用首先這個名字,所以你只需要爲「真正的」屬性指定值班上。儘管這個問題並不重要。

如果要通過創建日期最近的項目,也有一些不同的方法可以做到這一點,但我覺得這是很有道理的:

def mostRecent = Burndown.listOrderByDateCreated(max: 1, order: 'desc')[0] 

,或者如果你保留你的名字

def mostRecent = Burndown.listOrderByCreateDate(max: 1, order: 'desc')[0] 

這是在http://grails.org/doc/latest/描述 - 這是一個很好的手冊,值得一讀。

+0

好的。從內存中得到了dateCreated錯誤(應該做這麼多的複製和粘貼)。但我想你的解決方案只返回最近的項目。我想每天得到最後一個條目:-)所以每天只有一個條目的大列表... – rdmueller 2011-05-23 19:53:38

+1

嘗試'def mostRecentPerDay = Burndown.executeQuery('從Burndown其中id在(從中選擇max(id)from Burndown group by cast(dateCreated as date))')' – 2011-05-23 20:21:24

+0

好的。我想這正是我正在尋找的。我明天會測試它... – rdmueller 2011-05-23 20:40:37

1

不是Grails的用戶是什麼,所以下面應該由Grails'ist相應修正

如果域是相關的,試一下像:

Foo.findAllInList(Bar.list([group:'create_date'])) 
+0

我想一個小組是不夠的,因爲它不能保證我得到每一天的最後一項(對不起,只是在我的問題中添加了最大值)) – rdmueller 2011-05-23 19:57:20

+1

Burt爲Spring工作,是一個Grails「重」,所以我在這件事上他會順從他。你有沒有考慮在地圖參數中添加「create_date」命令?這個「應該」分組並且每天得到最後一個項目。不妨創建幾個簡單的測試域並在這裏運行建議(在dataSources配置中將「loggingSql = true」添加到適用的閉包中,以驗證生成的sql不僅與您手動編寫的內容接近,而且不會加載整個DB; - )) – virtualeyes 2011-05-23 20:13:46

+0

hm。創建一些測試的好主意:-)我會試一試... – rdmueller 2011-05-23 20:28:03