2

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

4

2 回答 2

9

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

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

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

于 2013-09-09T16:17:19.090 回答
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]
于 2013-09-09T15:50:20.537 回答