2012-02-28 3 views
0

OK, 나는 Grails뿐만 아니라 최대 절전 모드를 처음 사용했다. 나는 간단한 프로토 타입을 작성하고 있으며, join을 통해 가장 간단한 many-to-many 관계를 쿼리하는 것에 매달리고있다.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를 원합니다.

저는 원하는 결과를 얻을 수있는 쿼리를 만들려고 노력하고 있습니다. 아무 소용이 없습니다. 나는 티에 온라인 예제를 따라 왔지만이 쿼리를 작동시키지 못한다고 생각한다.

하나 개 내가 해봤 쿼리 버전 :

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

또는이 변형 : 나는 많은 다른 많은 .ID 사용을 포함하여 변화, 또는 역할을 시도했습니다

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

= someRoleInstance 등 아무것도 작동하지 않습니다. 나는 아이디어가 없어. 밖에 도움이 필요 하신가요?

데이터베이스는 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 콘솔을 실행할 때 응답의 기준 예제가 모두 정상적으로 작동합니다. 그래서 나는 쉘 문제라고 생각합니다. 스윙 기반 콘솔이 훨씬 사용하기 쉽기 때문에 유지 보수가 잘되어 있지 않습니다. –

+1

당신은 나를 놀 리고있어! 쉘이 ORM의 작동 방식에 영향을 줄 수 있다고 믿기는 어렵지만 아직까지는 그렇습니다. 버트, 답변으로 의견을 추가하십시오, 내가 받아 들일 수 있도록 (글쎄, 당신이 말한 것을 받아 들일 수 있습니다. – smendola

답변

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

당신이 대신 기준 쿼리를 사용하고자하는 경우에 작동합니다 기준

+0

감사합니다. 그래도 그 일은하지 않았습니다. OP 편집을 참조하십시오. – smendola

0

를 사용해보십시오 :

String roleName = 'Admin' 

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

감사합니다. 그래도 그 일은하지 않았습니다. OP 편집을 참조하십시오. – smendola

관련 문제