4

我正在查看我当前项目中的一些 grails gorm 代码,我想知道以下 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()
                    }
                }

我相信我的方法会更具可测试性并且更具可读性,但我想知道我的想法是否只是教条

据我所知,grails 模拟框架不支持 HQL 语句。

4

1 回答 1

5

您的方法更具可读性,但性能要差得多。您将所有实例(包括不会更改的数据)读入内存,进行更改,然后将所有内容(包括未更改的值)推送回数据库。如果您的域类及其值很小,这没什么大不了的(尤其是在记录数不太大的情况下),但通常这种方法是一个可伸缩性问题。

通过直接使用 executeUpdate 运行查询,您可以让数据库做它擅长的事情——它可以找到需要更新的记录并完成工作,而无需数据库和 Web 服务器之间的所有不必要的流量。

没错,单元测试不支持 HQL,但您不应该对域类进行单元测试。如果您不针对数据库测试持久性,那么您所测试的只是模拟框架。

于 2013-03-20T15:29:37.420 回答