当我使用条件查询时, result包含lazy的数组列表 初始化的对象。就是这个清单 具有处理程序的值 org.codehaus.groovy.grails.orm.hibernate.proxy.GroovyAwareJavassistLazyInitializer。 这阻止我做任何数组 操作(减去,删除等)。 当我使用GORM方法时,我得到了数组 实际对象类型列表。怎么能 我在标准中得到了实际的对象 查询?代码如下所示。
- 醇>
availableTypes = Type.withCriteria() {
'in'("roleFrom", from) 'in'("roleTo", to) }availableTypes(数组列表)有 一个值,但不是实际的对象 使用处理程序的值 GroovyAwareJavassistLazyInitializer
- 的值 醇>
availableTypes = Type.findByRoleFrom(from)
availableTypes(数组列表)有 类型为
----------更新----------
我做了进一步的故障排除,这就是我发现的。可能上面的描述可能会产生误导,但我保留它以防它有所帮助。
def typeFrom = Type.findAllByParty(partyFrom)
def relFrom = Relation.findAllByParty(partyFrom)
class Role {
RoleType roleType
LocalDate validFrom
LocalDate validTo
static belongsTo = [party : Party ]
...
}
我知道如果我像Party.findAll()那样做声明,角色实例将是代理,直到他们访问。但是,当直接在类(Role)上使用gorm时,为什么我要获取代理对象???
感谢您的帮助。
感谢。
答案 0 :(得分:1)
原来是我遇到的几种可能的解决方案,但没试过,比如 - 重载equals方法以使代理和域 对象使用主键而不是hashCode进行相等 - 使用连接查询,以便您获得实际实例而不是代理 - GrailsHibernateUtil.unwrapProxy(o) - HibernateProxyHelper.getClassWithoutInitializingProxy(object)
对我有用的一个解决方案是在域对象映射中指定lazy loading to be false。
这个问题的历史似乎在这里讨论:GRAILS-4614
另请参阅:eager load