GORM キャッシングを扱っていると思われる奇妙な動作が見られますが、問題を解決する方法がわかりません。それぞれ開始日を持つ purchaseOrderEntries のリストを持つプロジェクト オブジェクトがあります。ユーザーが発注書の州の日付に 2 桁の年を入力した場合、それを 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
同じ並べ替えメソッドを呼び出すと、2 回目に異なる結果が得られるのはなぜですか? 私は何が欠けていますか?これは、休止状態の遅延ロードまたはキャッシングまたは何かの問題のように感じます。全く分からない。何か案は?
* より多くの情報で更新 * すべてのアイデアをありがとう。残念ながら、解決策はそれほど簡単ではないようです。並べ替えは正しく機能しています。毎回機能しているように見えます。これが、私があまり知らない何かの問題のように思われる理由です。プロジェクト オブジェクトには、購入注文エントリのリストが含まれます。これはリスト (セットではない) であり、 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 桁の年はグレゴリオ暦の日付であり、比較演算子は黙って失敗していると思われます。しかし....前の各ループにあったので、日付がまだ更新されていないのはなぜですか? それは私が得ていないものです。それぞれが project.purchaseOrderEntries を遅延フェッチするために SQL クエリを実行してから、(新しくソートされたリストの代わりに) これを再度使用していますか? 次のような新しいリストに並べ替えの結果を保持していても、
poEntryList?.each { DateHelper.updateTwoDigitYear(it?.startDate) } // support two digit year entry
def sortedList = poEntryList?.sort({it?.startDate})?.reverse()
新しい「sortedList」はまだ正しくソートされていません。これを可能な限り見る唯一の方法は、ソートに更新された日付を使用していない場合です。繰り返しになりますが、ご協力いただきありがとうございます。どんなアイデアでも大歓迎です。これは私を夢中にさせています。