使用Criteria Builder以一对多的方式查询另一种方式

时间:2010-01-31 22:06:04

标签: hibernate grails groovy gorm hibernate-criteria

假设我有以下一对多的关系:

Site has many Users
User belongs to one Site

我已经建立了这样的关系

class Site {
    static hasMany = [users:User]
    ...
}

class User {
    static belongsTo = [site:Site]
    int number
    String username
    ...
}

基本上我想更新特定网站上特定用户的用户名并返回User对象。我知道网站和新的用户名,所以我有一个功能,尝试使用条件构建器查找相应的连接:

class funcClass {
    User func(Site site, int number, String newUserName) {
        def results = User.createCriteria()
        results.list = {
             eq('number', number)
             site {
                 idEq(site.id)
             }
        }
        ...
        def user = results[0]
        ...
        return user
    }
}

我得到类似的例外:

groovy.lang.MissingMethodException: No signature of method: static com.myapp.Site.call() is application for arguemtns types: ( funcClass$_closure )

这可以通过Criteria Builder实现吗? 我意识到我可以在其他方面进行查询,在那里我从站点到用户构建Criteria,但是我必须遍历站点的所有用户以找到与我想要更新的号码相匹配的用户。我只是要使用HQL查询吗?

1 个答案:

答案 0 :(得分:2)

应该是

def criteria = User.createCriteria()
def users = criteria.list {
   eq('site', site)
   eq('number', number)
   maxResults(1)
}
def user = users[0]

但您可以使用简单的动态查找器执行此操作:

def user = User.findBySiteAndNumber(site, number)