2015-12-01 72 views
0

我知道我可以在Grails中做Parent.childId,但是我能做些什麼來爲hasMany中的每個孩子加載ids(代理)嗎?即,類似於Parent.childrenIds的東西?只從grails中的hasMany中獲取ID?

在我的情況下,hasMany由joinTable映射。

+0

不盡如人意,但我確定'createCriteria()'解決方案是可能的。考慮如何將db表與列中具有父級id的子類映射出來,可能會導致提取不管,所以我不確定你可以獲得多少。 – tylerwal

+0

實際上,我爲這種特殊的關係使用了一個joinTable--所以兒童ID可以在單獨的表中使用。如果Grails提供了Parent.childrenIds或類似的細節,可能會在窗簾後處理。 – wwwclaes

回答

0

考慮到一個joinTable

def getChildIds(parentId) { 
    Child.withSession { session -> 
     def sql = new Sql(session.connection())  
     sql.rows(
      'select pc.child_id from parent_child pc where pc.parent_id = :parentId', 
      [parentId: parentId] 
     ).collect{ it.child_id } 
    } 
} 

這適用於映射爲這樣一個joinTable

class Parent { 

    static mapping = { 
     childs joinTable: [name: 'parent_child', column: 'child_id', key: 'parent_id'] 
    } 
    ... 

它不漂亮,但我相信這是對有關情況和需求的最佳途徑。

+0

我打算接受這個答案,雖然我不打算使用它,因爲「不漂亮」 - 部分:-)感謝您的努力! – wwwclaes

2

你可以用projection來做到這一點。例如

def result = Child.createCriteria().list { 
    projections { 
     property('id') 
    } 
    eq ('parent', parent) 
} 

這將只返回子對象的ID。

+0

感謝和很好的答案。但是我爲這個特定的關係使用了一個joinTable,所以我恐怕這不會立即解決它(parent在子域中不可用)。對不起,我沒有意識到它,直到你回答。 – wwwclaes