我想使用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)
问题是,
allBarsOfUser
和Bar_$$_javassist_139
的元素类型以及bars
的要素类型为Bar
,因此intersectedBars
始终为[]
。我通过执行以下操作解决了我的问题-但我不喜欢该解决方案:
def allBarsOfUser = userInstance.foos.bars.flatten().collect{Bar.get(it.id)}
有什么更好的解决方案?
如何将
Bar_$$_javassist_139
转换为Bar
,以便intersect()
正常工作?
最佳答案
这取决于您实际上要做什么。 intersect
方法最终依赖于equals
,因此,如果您在equals
中实现hashCode
和Bar
,则它将执行您想要的操作。但是,通常不应使用对象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/