2012-02-28 76 views
0

好吧,我是新來的Grails,以及休眠。我簡單地描述了一些東西,並且堅持通過聯接來查詢最簡單的多對多關係。Grails/GORM簡單的多對多連接查詢不起作用?

我的模型對象:

class User { 

    static hasMany = [roles:Role] 

    String firstName 
    String lastName 
    String username 
    String password 

    // ... constraints and hooks omitted ... 

} 


class Role { 
    static hasMany = [users:User] 
    static belongsTo = User 

    String name; 
    // ... constraints and hooks omitted ... 

} 

加載一些數據後,我可以看到:

groovy:000> User.list().each { user-> println "$user.username : ${user.roles.collect {it.name}}"} 
smendola : [Admin, Reviewer] 
jripper : [] 
jbauer : [] 

groovy:000> Role.list().each { role-> println "$role.name: ${role.users?.collect {it.username}}"} 
Admin: [smendola] 
Guest: null 
Reviewer: [smendola] 

因此,用戶smendola有兩個作用;其他用戶沒有角色;雙方的關係正在朝着雙向發展。好。

現在的問題: 我想查詢具有某個角色的用戶。當然,我可以使用上述兩個查詢中的任何一個的返回值並在Groovy中進行搜索,但我希望db能夠完成這項工作。

我已經推出HOURS試圖構建一個查詢,會給我想要的結果,無濟於事。我相信我已經遵循在線示例來開球,但我無法使這個查詢工作。查詢

一個版本我已​​經試過:

groovy:000> User.where { roles.name == 'Admin' }.list() 
===> [] 

或者這個變體:

groovy:000> User.where { roles {name == 'Admin'}}.list() 
===> [] 

我試過很多很多其他的變化,包括使用.ID或角色=一些角色實例等等。我沒有想法。有什麼幫助嗎?

順便說一句,數據庫是h2。 Grails版本2.0.0

謝謝!

增加:被認爲 兩種型號,也沒有工作:

groovy:000> User.createCriteria().list{ roles { eq('name', 'Admin') } } 
===> [] 
groovy:000> 
groovy:000> roleName = 'Admin' 
===> Admin 
groovy:000> def users = User.withCriteria { 
groovy:001> roles { 
groovy:002>  eq('name', roleName) 
groovy:003> } 
groovy:004> } 
===> [] 
groovy:000> 
+0

我看到與運行'grails shell'相同的行爲,但你的例子和t他在運行'grails console'時將答案中的示例標準運行良好。所以我認爲這是一個殼問題。由於基於Swing的控制檯非常易於使用,因此它的維護狀況不佳。 – 2012-02-28 18:46:54

+1

你有GOT在開玩笑吧!我發現很難相信shell會影響ORM的行爲方式,但是它確實存在。 伯特,請添加您的評論作爲答案,所以我可以接受它(嗯,我接受你說的話,不確定我接受,這就是Grails是如何!)非常感謝。 – smendola 2012-02-28 20:17:25

回答

0
User.createCriteria().list{ 
    roles{ 
     eq('name', 'Admin') 
    } 
} 

嘗試使用標準

+0

謝謝;雖然沒有這樣做,請參閱編輯至OP。 – smendola 2012-02-28 17:10:51

0

,如果你願意使用一個標準查詢,而不是這應該工作:

String roleName = 'Admin' 

def users = User.withCriteria { 
    roles { 
    eq('name', roleName) 
    } 
} 
+0

謝謝;雖然沒有這樣做,請參閱編輯至OP。 – smendola 2012-02-28 17:09:54