hibernate - 使用Criteria Builder在一对多中查询另一种方式

标签 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有可能吗?
我意识到我可以反过来进行查询,在此基础上将标准从站点构建到用户,但是然后我必须遍历该站点的所有用户以查找与我要更新的号码相匹配的那个。我是否只需要使用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)

关于hibernate - 使用Criteria Builder在一对多中查询另一种方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2173566/

相关文章:

sorting - 按字符串列表中的ID对对象列表进行排序

gradle - Gradle任务依赖

maven - 如何从 Jenkins 声明式和脚本化管道内的 POM 中提取版本 ID?

hibernate - 对所有 Spring Repository find* 方法强制执行标准

Spring-Hibernate 应用程序 : Illegal access: this web application instance has been stopped already

java - 为什么Tomcat/JSP看不到这些类?

java - 在 JPA 查询中从 GROUP BY 创建 Map 对象

grails - grails 3.1.8坚持说解决依赖关系

grails - grails spring安全性登录页面显示

jenkins - 检查资源是否被锁定