Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate 何时在grails中使用executeUpdate_Hibernate_Grails_Hql_Gorm - Fatal编程技术网

Hibernate 何时在grails中使用executeUpdate

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

我正在查看当前项目中的一些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 mocking framework不支持HQL语句。

您的方法更具可读性,但性能要差得多。将所有实例(包括不会更改的数据)读入内存,进行更改,并将所有内容(包括未更改的值)推回数据库。如果您的域类及其值很小,这并不是什么大问题(特别是如果记录的数量不是太大的话),但一般来说,这种方法是一个可伸缩性问题

通过使用executeUpdate直接运行查询,您可以让数据库做它擅长的事情—它可以找到需要更新的记录,并在数据库和web服务器之间消除所有不必要的通信量


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

我的意思是模拟域类,即不测试框架这里只涉及大约1020条记录,但即使,是否可以在事务中包装调用以创建一个相同的查询?在事务中包装查询不会改变查询的数量。我刚刚意识到是谁给出了这个答案!非常尊敬:-)