Сделайте запрос по-другому через Criteria Builder - PullRequest
0 голосов
/ 01 февраля 2010

Допустим, у меня есть следующие отношения один-ко-многим:

Site has many Users
User belongs to one Site

Я настроил отношения вот так

class Site {
    static hasMany = [users:User]
    ...
}

и

class User {
    static belongsTo = [site:Site]
    int number
    String username
    ...
}

В основном я хочу обновить имя пользователя для конкретного пользователя на определенном сайте и вернуть объект пользователя. Я знаю сайт и новое имя пользователя, поэтому у меня есть функция, которая пытается найти соответствующее соединение с помощью построителя критериев:

class funcClass {
    User func(Site site, int number, String newUserName) {
        def results = User.createCriteria()
        results.list = {
             eq('number', number)
             site {
                 idEq(site.id)
             }
        }
        ...
        def user = results[0]
        ...
        return user
    }
}

Я получаю исключение, похожее на:

groovy.lang.MissingMethodException: No signature of method: static com.myapp.Site.call() is application for arguemtns types: ( funcClass$_closure )

Возможно ли это с помощью Criteria Builder? Я понимаю, что могу выполнить запрос в другом случае, где я строю критерии от сайта к пользователю, но затем мне нужно пройтись по всем пользователям сайта, чтобы найти того, который соответствует номеру, который я хотел обновить. Я просто собираюсь использовать HQL-запрос?

1 Ответ

2 голосов
/ 01 февраля 2010

должно быть

def criteria = User.createCriteria()
def users = criteria.list {
   eq('site', site)
   eq('number', number)
   maxResults(1)
}
def user = users[0]

но вы можете сделать это с помощью простого динамического поиска:

def user = User.findBySiteAndNumber(site, number)
...