4

現在のプロジェクトでいくつかのgrailsgormコードを調べていますが、次のHQLアプローチの長所と短所は何でしょうか。

UploadUpsell.executeUpdate("update UploadUpsell set processedStatus=:newStatus, processedDate=:processedDate where processedDate is null and period=:period",
                            [newStatus: EXPIRED_UPSELL_STATUS, processedDate: new Date(), period: flow.period])

私は線に沿ってもっと慣用的なアプローチをとっていただろう

UploadUpsell.findAllByPeriodAndProcessedDate(flow.period, null).each { UploadUpsell uploadUpsell ->
                    uploadUpsell.with {
                        processedStatus = EXPIRED_UPSELL_STATUS
                        processedDate = new Date()
                        save()
                    }
                }

私のアプローチはよりテスト可能で読みやすいと思いますが、私の考え方は独断的であるかどうか疑問に思っています

私の知る限り、HQLステートメントはgrailsモックフレームワークではサポートされていません。

4

1 に答える 1

5

あなたのアプローチはより読みやすくなりますが、パフォーマンスははるかに低くなります。変更しないデータを含むすべてのインスタンスをメモリに読み込み、変更を加え、変更されていない値を含むすべてをデータベースにプッシュします。ドメインクラスとその値が小さい場合、これは大したことではありませんが(特に、レコードの数が多すぎない場合)、一般に、このアプローチはスケーラビリティの問題です。

executeUpdateを使用してクエリを直接実行することにより、データベースに得意なことを実行させることができます。更新が必要なレコードを見つけて、データベースとWebサーバー間の不要なトラフィックをすべて排除して作業を実行できます。

HQLは単体テストでサポートされていないのは確かですが、ドメインクラスを単体テストするべきではありません。データベースに対して永続性をテストしない場合、テストするのはモックフレームワークだけです。

于 2013-03-20T15:29:37.420 に答える