我有一个查询,可以进行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的配置文件”。
答案 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]