grails-在域类中调用重写的getter

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

我正在使用Grails2.4.4。我有一个域名类

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}
}