grails - 如何将Javassist实例转换为特定域的实例

标签 grails gorm

我想使用grails 1.3.7将特定域类的实例的两个列表相交。

问题是,一个列表的实例是由javasisst创建的,因此交集的结果始终是一个空列表。

这是我的网域:

class User {
    ...
    static hasMany = [foos : Foo]
    ...
} 

class Foo {
    ...
    static hasMany = [bars : Bar]
    ...
}

class Bar {
    ...
    static hasMany = [localizedTitles : LocalizedTitle]
    ...
}

我得到用户的所有Bar实例的列表,如下所示:
def allBarsOfUser = userInstance.foos.bars.flatten()

并尝试与Bar实例的另一个列表相交:
def intersectedBars = bars.intersect(allBarsOfUser)

问题是,allBarsOfUserBar_$$_javassist_139的元素类型以及bars的要素类型为Bar,因此intersectedBars始终为[]

我通过执行以下操作解决了我的问题-但我不喜欢该解决方案:
def allBarsOfUser = userInstance.foos.bars.flatten().collect{Bar.get(it.id)}

有什么更好的解决方案?

如何将Bar_$$_javassist_139转换为Bar,以便intersect()正常工作?

最佳答案

这取决于您实际上要做什么。 intersect方法最终依赖于equals,因此,如果您在equals中实现hashCodeBar,则它将执行您想要的操作。但是,通常不应使用对象ID来实现equals,因为仅在保存对象时才分配ID,因此您将无法将新创建的对象与先前保存的对象进行比较。 Hibernate建议您使用implement it based on a business key(不是生成的ID,但它是稳定的,并且在对象的整个生命周期中都不会改变的东西)

class UserAccount {
  String username
  String realname

  public boolean equals(that) {
    return ((that instanceof UserAccount)
        && (this.username == that.username))
  }

  public int hashCode() {
    username.hashCode()
  }
}

因此,如果您确实希望进行ID比较,则可以更明确地进行比较。
def userBarIds = allBarsOfUser*.id
def intersectedBars = bars.findAll { it.id in userBarIds }

关于grails - 如何将Javassist实例转换为特定域的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11666426/

相关文章:

html - 在表 gsp 中的每一行之后添加属性中的文本

hibernate - org.hibernate.StaleObjectStateException:行已由另一个事务更新或删除(或未保存的值映射不正确)

sql - to_char函数在Hibernate中引发异常

使用 Redis 的 Grails spring-security-ldap 缓存缓存

email - grails 邮件 : render profile pictures from database in email

hibernate - 如何使域实例关联无效/刷新?

caching - Grails Controller 在更改数据库时未刷新缓存

spring - grails.gorm.transactions.Transactional不回滚

grails - 在grails中获取动态bean字段

unit-testing - Groovy中的单元测试Abstract类