【问题标题】:Query the other way across a one-to-many with Criteria Builder使用 Criteria Builder 以另一种方式查询一对多
【发布时间】:2011-01-11 12:39:54
【问题描述】:

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

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
    ...
}

基本上我想更新特定站点上特定用户的用户名并返回用户对象。我知道站点和新用户名,所以我有一个函数尝试使用标准构建器查找相应的连接:

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 查询吗?

【问题讨论】:

    标签: hibernate grails groovy grails-orm hibernate-criteria


    【解决方案1】:

    应该是

    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)
    

    【讨论】:

    • 哦。我不知道动态查找器适用于对象,我认为它们只适用于原语。我可以重构很多。谢谢!
    猜你喜欢
    • 2014-12-29
    • 2013-07-16
    • 2021-01-20
    • 2023-04-07
    • 2021-02-09
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多