grails-在域类中调用重写的getter
我正在使用Grails2.4.4。我有一个域名类grails-在域类中调用重写的getter,grails,Grails,我正在使用Grails2.4.4。我有一个域名类 class Purchase { static hasMany = [dataList:DataByPeriod] String name Set<DataByPeriod> dataList public Set<DataByPeriod> getDataList(){ dataList?.findAll { (!it.isDeleted) } } de
class Purchase {
static hasMany = [dataList:DataByPeriod]
String name
Set<DataByPeriod> dataList
public Set<DataByPeriod> getDataList(){
dataList?.findAll { (!it.isDeleted) }
}
def getPeriodList(){
this.dataList?.period?.unique()?.sort{it.name}
}
}
现在我想接收给定purchaseInstance的所有时段。如果我这样做:
purchaseInstance?.dataList?.period?.unique()?.sort{it.name}
我将获得正确的数据(将调用dataList
的getter,并忽略isDeleted==true的所有记录
但如果我这样做了:
purchaseInstance?.getPeriodList()
不会调用getter,并且会显示所有记录
为什么会发生这种情况?为什么我甚至不能将我的“getPeriodList()”方法更改为:
def getPeriodList(){
this.getDataList()?.period?.unique()?.sort{it.name}
}
它表示“没有用于类购买的getDataList()方法”。您不应该为此重写getter,这将与hibernate逻辑冲突。请引入另一种方法,如List dataListNotDeleted()
或更好的方法是使用命名查询
。非常好的一点-如果您返回的值与Hibernate最初设置的值不同,则会导致Hibernate将该属性标记为“dirty”,并将所有值推送到数据库,即使您仅加载实例的数据,但并不是有意更改任何内容。谢谢您的建议。但我怀疑问题在于覆盖,因为如果我直接(在控制器中)调用它,它工作正常。就我所知,这个重写是正确的,因为hasMany语句已经设置好了。我认为如果你听Burt的话,这将是一个非常好的主意。我相信他忘记了比我们其他人知道的更多的东西。只是说。@injecteer我用另一个方法替换了getter并创建了瞬态变量,现在它工作了(必须进行一些重构,但幸运的是没有太多)。但为什么我不能从同一类中的另一个方法调用我的getter呢?Idea IDE甚至在没有运行project的情况下就知道了,但我无法理解在它下面会发生什么,因为:(
def getPeriodList(){
this.getDataList()?.period?.unique()?.sort{it.name}
}