我看到一些奇怪的行为,我认为这些行为与 GORM 缓存有关,但我不知道如何解决这个问题。我有一个项目对象,其中包含一个 purchaseOrderEntries 列表,每个都有一个开始日期。如果用户在采购订单状态日期中输入两位数年份,我将其转换为 4 位数年份,然后对日期进行排序。但他们没有正确排序!这是重要的片段:
def updatePurchaseOrderEntryDates(def project) {
def poEntryList = project.purchaseOrderEntries
poEntryList?.each { DateHelper.updateTwoDigitYear(it?.startDate) } // 2-digit yr
poEntryList?.sort()
log.info "list 1: " + poEntryList
poEntryList?.sort()
log.info "list 2: " + poEntryList
输出以下内容:
list 1: 1965, 2020, null
list 2: 2020, 1965, null
第二次调用相同的排序方法怎么会产生不同的结果?我错过了什么?我觉得这是一个休眠延迟加载或缓存或其他问题。没有线索。有任何想法吗?
*更新W/更多信息* 感谢所有的想法。不幸的是,解决方案似乎并不那么容易。排序工作正常,只是似乎每次都有效。这就是为什么它似乎是一个我不太了解的问题。项目对象包含一个采购订单条目列表 - 这是一个列表(不是一组),并且 PurchaseOrderEntry 对象实现了 Comparable。这是代码:
class Project ... {
static hasMany = [purchaseOrderEntries:ProjectPurchaseOrderEntry, ...]
static mapping = {
purchaseOrderEntries cascade:'all-delete-orphan'
...
}
List<ProjectPurchaseOrderEntry> purchaseOrderEntries
...
}
class ProjectPurchaseOrderEntry ... implements Comparable {
Project project
Date startDate
Date endDate
...
int compareTo(obj) {
// Compare these dates in reverse older. i.e. put the newest/earliest date on the top and the oldest/null date at the end of the list
return obj.startDate <=> startDate // this comparison is done in reverse - comparator operator is null safe
}
...
}
换句话说,排序似乎工作正常。问题在这里
poEntryList?.each { DateHelper.updateTwoDigitYear(it?.startDate) } // 2-digit yr
poEntryList?.sort()
即使列表中的所有日期都更新为 4 位数的年份,它仍然会排序,就好像这些日期没有更新一样。我怀疑 2 位数的年份是儒略历日期,4 位数的年份是公历日期,并且我的比较运算符默默地失败了。但是......为什么日期没有更新,因为它们在之前的每个循环中?那是我没有得到的。是否每个人都在执行 SQL 查询以延迟获取 project.purchaseOrderEntries,然后再次使用它(而不是新排序的列表)?即使我将排序结果保存在一个新列表中,例如:
poEntryList?.each { DateHelper.updateTwoDigitYear(it?.startDate) } // support two digit year entry
def sortedList = poEntryList?.sort({it?.startDate})?.reverse()
新的“sortedList”仍然没有正确排序。我认为这可能的唯一方法是,如果它没有使用更新的日期进行排序。再次感谢您的所有帮助。欢迎任何想法。这个快把我逼疯了。