【问题标题】:Hibernate criteria - single object fetched休眠条件 - 获取单个对象
【发布时间】:2010-09-20 06:58:17
【问题描述】:

我正在使用 Hibernate (GORM) 进行 Grails 项目。我有以下领域模型:

ClientContact {
   static hasMany = [owners: Person]
   static belongsTo = [Person]
}

Person {
   static hasMany = [clientContacts: ClientContact]
}

当我尝试使用特定所有者 (Person) 检索所有 ClientContacts 时,我遇到了一些有趣的问题。我正在使用以下查询条件:

def query = {
   owners {
      eq("id", Long.parseLong(params.ownerId))
   }
}
def criteria = ClientContact.createCriteria()
def results = criteria.list(params, query) 

问题是,当我在结果中遍历每个ClientContacts 时,它们只有一个所有者 - 事实上,大多数都有许多其他所有者。是什么赋予了?我知道 hibernate/GORM 使用延迟获取,但是当我尝试访问它们时,我认为它会获取 ClientContact 上的所有其他所有者。

有什么想法吗?我想继续使用 list() 函数,因为它提供了一些不错的分页功能。

【问题讨论】:

    标签: hibernate grails groovy grails-orm


    【解决方案1】:

    两个快速观察:

    1. [Grails 文档](http://grails.org/doc/1.0.x/guide/5.%20Object%20Relational%20Mapping%20(GORM).html#5.2.1.3Many-to-many) 说 ma​​ny-to-many 关联必须手动编码,默认的脚手架不会这样做。
    2. 您可能需要使用eqId() 标准 - 请参阅createCriteria

    【讨论】:

    • 我已经添加了所有适当的方法来支持多对多关联。我知道这一点,因为我可以将 ClientContacts 添加到所有者。问题在于检索 - 如上所述。我尝试了 eqId() 搜索条件,但它最终返回了完全相反的 ClientContacts。我迷路了。
    【解决方案2】:

    id 和 version 是所有 GORM 类的特殊属性。您无需在类声明中指定它们,也不能对它们使用标准条件。

    你肯定需要使用 eqID 标准

       def query = {
              owners {
                    eqId(Long.parseLong(params.ownerId))
              }
       }
       def criteria = ClientContact.createCriteria()
       def results = criteria.list(params, query)
    

    【讨论】:

    • 不幸的是,当我使用上面的代码时......我收到一个错误,“没有方法签名:grails.orm.HibernateCriteriaBuilder.eqId() 适用于参数类型:(java.lang.长)值:{123}”。当我使用 idEq 时,如下所示:grails.org/Hibernate+Criteria+Builder,我得到一个空列表。
    【解决方案3】:

    我知道这个帖子很老了,但我今天遇到了完全相同的问题,解决方案似乎是使用别名,所以改为:

    def query = {
            owners {
                    eq("id", Long.parseLong(params.ownerId))
            }
    }
    

    大家可以试试:

    def query = {
            createAlias("owners", "o")
            eq("o.id", Long.parseLong(params.ownerId))
    }
    

    第一个查询创建左外连接,第二个查询创建内连接。更详细的描述请看这个链接:http://adhockery.blogspot.com/2009/06/querying-by-association-redux.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-12
      • 2017-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多