我正在查看当前项目中的一些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语句。答案 0 :(得分:4)
您的方法更具可读性,但效果却差得多。您将所有实例读入内存,包括您不会更改的数据,进行更改,并将所有内容推送回数据库,包括未更改的值。如果您的域类及其值很小,这不是什么大问题(特别是如果记录数量不是太大),但通常这种方法是可扩展性问题。
通过使用executeUpdate直接运行查询,您可以让数据库执行它擅长的操作 - 它可以找到需要更新的记录,并且可以完成数据库和Web服务器之间所有不必要的流量。< / p>
在单元测试中不支持HQL,但你不应该单元测试域类。如果不对数据库测试持久性,那么您所测试的只是模拟框架。