Hibernate Criteria vs HQL:哪个更快?

kco*_*ntu 67 performance hibernate hql hibernate-criteria

我一直在读一些水壶,但我仍然感到困惑.为什么?因为你提到的差异与绩效无关.它们与易用性有关.(Objetc(标准)和SQL(hql)).但我想知道"条件"是否因某种原因比hql慢.

我在另一个回答中读到了这个

"HQL和criteriaQuery之间的性能存在差异,每次使用criteriaQuery触发查询时,它都会为表名创建一个新别名,这不会反映在任何数据库的最后一个查询缓存中.这会导致开销编译生成的SQL,花费更多时间来执行." 作者:Varun Mehta.

这非常接近但是!我在另一个网站上阅读(http://gary-rowe.com/agilestack/tag/hibernate/)Hibernate 3.3及以上版本不再是这种情况(请阅读:9)Hibernate很慢,因为SQL生成的Criteria接口不一致)

我已经做了一些测试试图找出差异,但两者都生成qry并且它不会更改表的别名.

我很困惑.如果有人知道主要原因,请帮助我们.谢谢

Jos*_*vis 145

我是2004年编写Hibernate 3查询翻译器的人,所以我知道它是如何工作的.

理论上,标准应该比HQL查询具有更少的开销(命名查询除外,我将得到).这是因为Criteria不需要解析任何东西.使用基于ANTLR的解析器解析HQL查询,然后将生成的AST转换为SQL.但是,使用HQL/JPAQL,您可以定义命名查询,其中在SessionFactory启动时生成SQL.理论上,命名查询的开销小于Criteria.

因此,就SQL生成开销而言,我们有:

  1. 命名为HQL/JPAQL查询 - SQL生成只发生一次.
  2. 标准 - 生成之前无需解析.
  3. (非命名)HQL/JPAQL查询 - 解析,然后生成.

也就是说,在我看来,选择基于解析和SQL生成开销的查询技术可能是一个错误.与使用真实数据在真实数据库服务器上执行实际查询相比,此开销通常非常小.如果在分析应用程序时实际显示此开销,那么您可能应该切换到命名查询.

在Criteria和HQL/JPAQL之间做出决定时,我会考虑以下事项:

  • 首先,你必须决定,如果你确定与具有Hibernate的专有API的依赖在你的代码.JPA没有Criteria.
  • Criteria非常擅长处理许多可选搜索参数,例如您可能在具有多参数"搜索表单"的典型网页上找到的参数.使用HQL,开发人员倾向于使用StringBuilder来处理where子句表达式(避免这种情况!).使用Criteria,您不需要这样做.Hardik发表了类似的意见.
  • HQL/JPAQL可以用于大多数其他事情,因为代码往往更小,更容易让开发人员理解.
  • 如果使用HQL,则可以将频繁查询转换为命名查询.经过一些剖析后,我宁愿稍后再这样做.

  • @destan从JPA 2.x开始,它确实如此.IIRC,JPA 1.x没有. (3认同)
  • @bruno.zambiazi如果您通过字符串连接构建JPAQL/HQL,那么很可能您有一个动态查询,这就是Criteria查询功能的用途.我倾向于将Criteria用于任何动态(例如,查询因用户输入而变化很大).HTH - Josh (2认同)

小智 8

我正在研究数百万的记录.我发现HQL比Criteria快得多.标准在性能方面落后很多.

如果您正在处理大量数据,那么请转到HQL.

  • 这对我来说没什么意义.如果您有一个非常大的数据集,那么大部分时间都花在等待数据库处理查询上.在这种情况下,从HQL或Criteria生成SQL所需的时间并不重要.使用JPAQL命名查询与"直接"JPAQL与Criteria的唯一时间是在同一个查询*多次*时.数据集的大小根本不重要. (5认同)
  • 可能是您没有正确使用Criteria。还是为数百万条记录中的每条记录创建了一个新的Criteria Query对象? (2认同)

Har*_*hra 5

我最喜欢动态查询的条件查询。例如,动态添加一些订购或根据某些参数省去某些零件(例如限制)要容易得多。

另一方面,我将HQL用于静态和复杂查询,因为它更易于理解/阅读HQL。另外,我认为HQL功能更强大,例如对于不同的联接类型。

JPA和Hibernate-条件与JPQL或HQL

  • 如果您要复制别人的答案,则至少应提及它。链接到原始答案:http://stackoverflow.com/a/197496/980103 (25认同)
  • 条件可以执行HQL可以执行的大多数联接类型,尽管有时有些尴尬或难以理解(至少在我看来)。绝对正确,HQL更容易阅读! (4认同)

omk*_*rra 5

我认为针对HQL的标准的其他优势

编写HQL使代码混乱。看起来不再像编写干净的面向对象代码了。

在编写Criteria Queries时,IDE会建议我们使用Intellisense,因此犯错误的机会较小,除非我们在双引号中写变量名之类的东西。

  • 对于复杂的查询,HQL比条件更易读。 (4认同)