如何创建一个findAllByUser查询,其中用户是嵌入式类的成员?

时间:2011-11-10 16:20:33

标签: hibernate grails groovy

我在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)

为了实现这一点,我在Room域类中实现了clousure findAllByUser

但是,当我调用闭包时,我会在此行中获得Null Pointer异常。

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

用户不为空。所以一定是我糟糕的HQL。任何人都可以帮助我吗?

2 个答案:

答案 0 :(得分:4)

我认为更好的选择是使用命名查询。它看起来更漂亮,也可以提供更多功能:

只需将此添加到您的Room域类

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

然后像这样称呼它:

def roomsByUser = Room.byUser(currentUser).list()

答案 1 :(得分:2)

适合我:

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)