如何优化此GORM查询

时间:2013-09-09 15:21:50

标签: hibernate grails gorm

我有一个查询,可以进行2次数据库查询。我是GORM的新手,不知道如何使用条件或where子句或其他内容将其优化为1个查询。我也使用springsecurity并且具有用于登录安全性的User类。我有一个带有User对象的Profile类:

class Profile {
   User user
}

在我的控制器中,会话存储用户ID。当我想加载配置文件来更新它时,我的代码目前是:

def user = User.get(springSecurityService.principal.id) // 1st db query
def domainObject = Profile.findByUser(user) // 2nd db query

我通过试验和错误尝试了一些查询变体,但似乎找不到不会产生错误的变量。这似乎是微不足道的。伪查询将“获取具有此用户ID的profile.user的配置文件”。

2 个答案:

答案 0 :(得分:9)

您可以使用load方法来避免第一次数据库查询:

def user = User.load(springSecurityService.principal.id)
def domainObject = Profile.findByUser(user)

这是有效的,因为load在访问id以外的任何属性之前不会触发数据库查找,但这就是findByUser所需的全部内容,因为它是外键。

答案 1 :(得分:4)

我愿意:

def profile = Profile.createCriteria().list {
    user{
        eq 'id',springSecurityService.principal.id
    }
}[0]

def profile = Profile.executeQuery('select p from Profile p where p.user.id = :userId',[userId:springSecurityService.principal.id])[0]