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

Hibernate 使用Criteria Builder以另一种方式跨一对多查询,hibernate,grails,groovy,gorm,hibernate-criteria,Hibernate,Grails,Groovy,Gorm,Hibernate Criteria,假设我有以下一对多关系: Site has many Users User belongs to one Site 我已经建立了这样的关系 class Site { static hasMany = [users:User] ... } 及 基本上,我想更新特定站点上特定用户的用户名并返回User对象。我知道该站点和新用户名,因此我有一个函数,可以尝试使用标准生成器查找相应的连接: class funcClass { User func(Site site, int

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

Site has many Users
User belongs to one Site
我已经建立了这样的关系

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

基本上,我想更新特定站点上特定用户的用户名并返回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可以这样做吗? 我意识到我可以用另一种方式进行查询,从一个站点到另一个用户建立查询条件,但随后我必须遍历该站点的所有用户,以找到与我要更新的数字匹配的用户。我只是需要使用HQL查询吗?

应该是这样的

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)

哦。我不知道动态查找器处理对象,我以为它们只处理原语。我可以重构很多东西。谢谢
def user = User.findBySiteAndNumber(site, number)