Как создать запрос findAllByUser, где пользователь является членом встроенного класса? - PullRequest
2 голосов
/ 10 ноября 2011

У меня есть следующие два класса домена в приложении Grails:

class Room {
    String name
    RoomType roomType
    def static findAllByUser = { user, params ->
        List<Room> rooms = Room.findAll("from Room r where r.roomType.user = :user", [user: user], params)
        return rooms
    }
}

class RoomType {
    String name
    User user
}

Я хочу иметь возможность получить все комнаты, созданные конкретным пользователем.

def currentUser  = currentUser()
def rooms = Room.findAllByUser(currentUser)

Для этого я реализовал clousure findAllByUser в классе домена Room.

Однако, когда я вызываю замыкание, я получаю исключение Null Pointer в этой строке.

List<Room> rooms = Room.findAll("from Room r where r.roomType.user = :user", [user: user], params)

Пользователь не равен нулю. Так что, должно быть, мой плохой HQL. Кто-нибудь может мне помочь?

Ответы [ 2 ]

4 голосов
/ 11 ноября 2011

Я думаю, что лучше было бы использовать именованный запрос.Это приятнее на вид и может предоставить больше функциональности:

Просто добавьте это в свой класс домена Room

static namedQueries = { 
    byUser { findUser ->
        roomType {
            eq 'user', findUser
        }
    }
}

И затем назовите это так:

def roomsByUser = Room.byUser(currentUser).list()
2 голосов
/ 11 ноября 2011

у меня работает:

1) установить поведение по умолчанию для второго параметра 'params', если вы не используете его!

class Room {
String name
RoomType roomType
def static findAllByUser = { user, params = [sort:'name'] ->
    List<Room> rooms = Room.findAll("from Room r where r.roomType.user = :user", [user: user], params)
    return rooms
}

}

2) например, переименовать переменную currentUser в user (я полагаю, что имя замыкания похоже на имя переменной => не очень хорошо)

def user = currentUser()
def rooms = Room.findAllByUser(user)

Но более элегантное решение состоит в том, чтобы поместить логику запросов в службу grails (например, RoomService.groovy)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...