我将这个问题集中在'报告类型'查询(计数,平均等等,即那些不返回域模型的查询)上,我只是想知道使用HQL是否有任何固有的性能优势,如它可能能够利用二级缓存。或者甚至更好 - 缓存整个查询。
明显的隐含好处是NHibernate知道列名是什么,因为它已经知道模型映射。
我应该注意哪些其他好处?
[我正在使用NHibernate,但我认为在这个实例中适用于Hibernate的内容同样适用于NHibernate]
答案 0 :(得分:2)
没有任何优势。 HQL不会胜过直接数据库查询以执行数据聚合和计算。 结果如下:
Select count(*), dept from employees group by dept
在HQL中始终在DB上执行得更快。注意我说总是,因为采取'取决于你的情况'思路是很蹩脚的。如果它与数据和数据聚合有关;在SQL中做。
答案 1 :(得分:1)
二级缓存中的对象仅通过id检索,因此Hibernate将始终运行查询以获取ID列表,然后从二级缓存或另一个查询中读取这些对象。
另一方面,Hibernate可以缓存查询并在某些情况下完全避免DB调用。但是,您必须考虑对查询中涉及的任何表进行更改将使其无效,因此您可能不会经常访问缓存。请参阅here有关查询缓存如何工作的说明。
因此,如果查询被缓存,则查询的成本为0,或者与在直接SQL中执行查询的成本大致相同。根据您的数据更改频率,您可以通过启用查询缓存来节省很多,或者您可能无法保存任何内容。
如果您有大量查询并且您可以容忍过时的结果,我会说使用另一个缓存来查询结果只会每隔x分钟过期就好了。
答案 2 :(得分:0)
我能想到的唯一优势是ORM查询通常在(准备好的)语句级别缓存,因此如果您多次执行相同的查询,则可能会重复使用预准备语句。
但是既然你专门询问报告查询和性能,我就不会想到任何实用优势(我正在掩饰你有其他优势如数据的事实 - 访问一致性,ORM查询与SQL(大多数情况下用HQL编写查询更容易),数据类型转换等)
答案 3 :(得分:-4)
HQL是一种对象查询语言。 SQL是一种关系查询语言。