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)