Простой Grails / GORM простой многопользовательский запрос на соединение не работает? - PullRequest
0 голосов
/ 28 февраля 2012

ОК, я новичок в Grails, а также в Hibernate.Я создаю что-то простое и зацикливаюсь на запросе простейшего отношения «многие ко многим» через объединение.

Мои объекты модели:

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, но я хочу, чтобы БД выполнил эту работу.

Я остановился на HOURS, пытаясь создать запрос, который будетдать мне желаемый результат, но безрезультатно.Я полагаю, что следовал онлайн-примерам, но пока не могу заставить этот запрос работать.

Одна из версий запроса, которую я пробовал:

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

Или этот вариант:

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

Я пробовал много, много других вариантов, включая использование .id или role = 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>

Ответы [ 2 ]

0 голосов
/ 28 февраля 2012

Это должно работать, если вы хотите вместо этого использовать критерий запроса:

String roleName = 'Admin'

def users = User.withCriteria {
  roles {
    eq('name', roleName)
  }
}
0 голосов
/ 28 февраля 2012
User.createCriteria().list{
    roles{
        eq('name', 'Admin')
    }
}

Попробуйте использовать критерии

...