2011-09-13 34 views
0

查詢:我想知道如何在Grails中獲得最新的域實體條目。[查詢]每個組的Grails getLast條目​​通過

問題域:

class Parent { 

    String name 
    static hasMany = [children:Child] 
} 


class Child { 

     String name 
     Parent parent 
     static belongsTo = [parent:Parent] 

    } 

數據模型 enter image description here

結果

我喜歡拉記錄ID爲4和7

其中critria應該是「得我最後一個孩子的父母的記錄AME像 'Rox的%'

到目前爲止,我已經嘗試

SELECT 
MAX(id) 
FROM child 
WHERE parent_id IN(SELECT 
        p.id 
        FROM parent AS p 
        JOIN child AS c 
         ON (c.parent_id = p.id 
          AND c.name LIKE 'Rox%')) 
GROUP BY parent_id 

在此先感謝。

+0

什麼構成「最後的記錄」?這是基於什麼? –

+0

我用普通的sql查詢更新了問題。也許這有助於找出我正在尋找什麼。感謝 – Rehman

+0

是否有任何理由使用'id'來查找最新記錄而不是'dateCreated'時間戳?前者似乎容易出錯。 –

回答

0

你的描述是一點點的黑幕,但我認爲這是你想要什麼:

def idList = [1,4] 
def c = Parent.createCriteria() 
def result = c.list { 
    'in'("id", idList) 
    children { 
    like("name","Rox%") 
    } 
    groupProperty("id") 
} 

編輯:

你周圍改變你的整個問題,而我輸入我的回答出來,改成了繞到比賽。

最終編輯: 在編輯後的代碼中爲孩子添加排序以獲得您想要的排序。

+0

感謝它的工作原理。此外,我發佈適當的答案與您的進一步建議,如「排序給孩子」 – Rehman

0
  Parent.createCriteria().list(max:10,offset:0) { 
        'children' { 
            like("name","Rox%") 
            order("id","desc") 
            groupProperty("id") 
           } 


        groupProperty("id") 
       } 

 Parent.createCriteria().list(max:10,offset:0) { 

          createAlias("children", "ac") 
          like("ac.name","Rox%") 
          order("ac.id","desc") 
          groupProperty("ac.id") 

        groupProperty("id") 
       } 

其中兩個標準的查詢彼此基礎上不同的連接。爲進一步閱讀標準聯接 http://adhockery.blogspot.com/2009/06/querying-by-association-redux.html

0

爲此,您需要一個SQL window function。在Oracle中,它看起來像:

select max(id) 
over(partition by parent_id, order by dateCreated) 
from child 
group by parent_id 

在Hibernate/HQL的單個查詢中沒有辦法做到這一點。

(你也想得到第9條記錄吧?)