Hibernate 何时在grails中使用executeUpdate
我正在查看当前项目中的一些grails gorm代码,我想知道以下HQL方法的优缺点是什么:Hibernate 何时在grails中使用executeUpdate,hibernate,grails,hql,gorm,Hibernate,Grails,Hql,Gorm,我正在查看当前项目中的一些grails gorm代码,我想知道以下HQL方法的优缺点是什么: UploadUpsell.executeUpdate("update UploadUpsell set processedStatus=:newStatus, processedDate=:processedDate where processedDate is null and period=:period", [newStatus: EXPIR
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 mocking framework不支持HQL语句。您的方法更具可读性,但性能要差得多。将所有实例(包括不会更改的数据)读入内存,进行更改,并将所有内容(包括未更改的值)推回数据库。如果您的域类及其值很小,这并不是什么大问题(特别是如果记录的数量不是太大的话),但一般来说,这种方法是一个可伸缩性问题 通过使用executeUpdate直接运行查询,您可以让数据库做它擅长的事情—它可以找到需要更新的记录,并在数据库和web服务器之间消除所有不必要的通信量
单元测试不支持HQL,这是对的,但不应该对域类进行单元测试。如果您不针对数据库测试持久性,那么您所测试的就是模拟框架。我的意思是模拟域类,即不测试框架这里只涉及大约1020条记录,但即使,是否可以在事务中包装调用以创建一个相同的查询?在事务中包装查询不会改变查询的数量。我刚刚意识到是谁给出了这个答案!非常尊敬:-)