gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 14:08:35 27 4
gpt4 key购买 nike

我想使用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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com