Hibernate Criteria vs HQL:哪个更快?

我一直在读一些歌,但我仍然困惑。 为什么? 因为你提到的差异与performance无关。 它们与易用性有关(Objetc(标准)和SQL(hql))。 但我想知道是否由于某些原因,“标准”比hql慢。

我在另一个口中读到这个

“HQL和criteriaQuery之间在性能上有所不同,每次使用criteriaQuery启动查询时,它会为表名称创build一个新的别名,而不会在任何数据库的最后一次查询caching中反映出来。编译生成的SQL,需要更多的时间来执行。“ 由Varun Mehta。

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

我已经做了一些testing,试图找出差异,但都生成qry的,它不会改变表的别名。

我很困惑。 如果有人知道主要原因,你能帮助我们吗? 谢谢

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

在理论上,标准的开销应该比HQL查询less(除了命名查询,我将会介绍)。 这是因为Criteria不需要parsing任何东西。 使用基于ANTLR的parsing器分析HQL查询,然后将生成的AST转换为SQL。 但是,使用HQL / JPAQL,您可以定义命名查询,在SessionFactory启动时生成SQL。 理论上,命名查询的开销比Criterialess。

所以,就SQL生成开销而言,我们有:

  1. 命名为HQL / JPAQL查询 – SQL生成只发生一次。
  2. 标准 – 在生成之前不需要parsing。
  3. (非命名)HQL / JPAQL查询 – parsing,然后生成。

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

以下是我在决定Criteria和HQL / JPAQL时考虑的事情:

  • 首先,您必须决定是否在代码中依赖于Hibernate专有的API 。 JPA没有标准。
  • 标准非常擅长处理许多可选的search参数,例如您可以在具有多参数“search表单”的典型网页上find这些参数。 使用HQL,开发人员倾向于使用StringBuilder处理where子句expression式( 避免这种情况! )。 有了标准,你不需要那样做。 Hardik发表了类似的观点。
  • HQL / JPAQL可以用于大多数其他事情,因为代码往往更小,更易于开发人员理解。
  • 如果您使用HQL,真正频繁的查询可以转换为命名查询。 我更喜欢稍后再做一些分析。

我正在创造数百万条logging。 我发现HQL比Criteria快得多。 标准在性能上滞后很多。

如果你正在处理大量的数据,那么去HQL。

其他优点我认为对HQL的标准

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

在编写Criteria Queries时,IDE使用Intellisense提示我们,所以除了在双引号中写variables名之类的东西的时候,犯错的机会就会减less。

我大多更喜欢dynamic查询的条件查询。 例如,dynamic地添加一些sorting或者根据某些参数留下一些部分(例如限制)会容易得多。

另一方面,我使用HQL进行静态和复杂的查询,因为它更容易理解/读取HQL。 另外,我认为HQL有点强大,例如对于不同的连接types。

JPA和Hibernate – Criteria与JPQL或HQL

你是对的,不是。 使用org.hibernate.loader.Loader类从数据库或caching中检索结果列表。 当caching未启用时,使用在SessionFactoryImp中创build的Dialect对象构build预准备语句。 所以,语句要么是每个列表调用初始化。 此外,自动生成低级查询。 基本上,这是一个援助,但可能会有一个情况下,手动编写一个特定的查询会更有效。