Hibernate 标准与 HQL: 哪个更快?

我一直在读一些答案,但我仍然感到困惑。为什么?因为你提到的差异与表现无关。它们与易于使用有关。(Objecetc (条件)和 SQL (hql))。但是我想知道是否“标准”由于某种原因比 hql 慢。

我在另一个答案里读到的

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

这是非常接近,但是!我在另一个网站上看到( http://gary-rowe.com/agilestack/tag/Hibernate/) Hibernate 3.3及以上版本的情况已经不同了(请阅读: 9) Hibernate 速度很慢,因为 Criteria 界面生成的 SQL 不一致)

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

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

62598 次浏览

对于动态查询,我更喜欢 Criteria Query。例如,根据一些参数动态添加一些排序或者保留一些部分(例如限制)就容易得多。

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

JPA 和 Hibernate-Criteria 与 JPQL 或 HQL 的比较

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

标准,在理论上应该比 HQL 查询的开销小(除了命名查询,我将讨论这个问题)。这是因为 Criteria 不需要解析任何内容。使用基于 ANTLR 的解析器解析 HQL 查询,然后将生成的 AST 转换为 SQL。但是,使用 HQL/JPAQL,您可以定义命名查询,当 理论上,命名查询的开销比 Criteria 小。

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

  1. 命名 HQL/JPAQL Query-SQL 生成只发生一次。
  2. 条件-在生成之前不需要解析。
  3. (非命名) HQL/JPAQL Query-Parse,然后生成。

也就是说,在我看来 根据解析和 SQL 生成的开销来选择查询技术可能是一个错误。与使用实际数据在实际数据库服务器上执行实际查询相比,这种开销通常非常小。如果在分析应用程序时确实出现了这种开销,那么 也许吧应该切换到命名查询。

下面是我在选择 Criteria 和 HQL/JPAQL 时考虑的事情:

  • 首先,您必须决定您是否是代码中有 依赖 Hibernate 专用 API好的。JPA 没有标准。
  • Criteria 真的很擅长处理很多可选的搜索参数 ,比如你可能在一个典型的带有多参数“搜索表单”的网页上找到的。使用 HQL,开发人员倾向于使用 StringBuilder (别这样!)附加 where 子句表达式。在 Criteria 中,您不需要这样做。哈迪克发表了类似的观点。
  • HQL/JPAQL 可以用于大多数其他事情,因为代码往往更小,更容易让开发人员理解。
  • 如果使用 HQL,真正频繁的查询可以转换为命名查询。我更喜欢稍后再做这个,在一些侧写之后。

我正在制作数百万张唱片。我发现 HQL 比 Criteria 快得多。标准在性能上落后很多。

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

我认为 Criteria 优于 HQL 的其他优点 :

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

在编写 Criteria Query 时,IDE 建议我们使用 Intellisense,因此除非我们用双引号编写类似变量名之类的内容,否则出错的几率较小。

你是对的,也不是。 使用 org.hibernate.loader.Loader类从数据库或缓存中检索结果列表。如果未启用缓存,则使用在 SessionFactoryImp 中创建的“方言”对象生成准备好的语句。因此,每个列表调用初始化的语句。 此外,底层查询是自动生成的。基本上,它是一种帮助,但是可能会有一种情况,当手动编写时,特定的查询会更有效。