Hibernate - Criteria vs命名查询

时间:2014-04-12 01:33:59

标签: hibernate orm criteria named-query

我试图将Hibernate Criteria与命名查询进行比较以获得性能。我知道这一切都取决于实际的查询本身,最后一个词是关于他们如何在运行时分析。仍然,试图理清每个内容。

我试图将Q分为两部分组织。寻找两者的验证/更正:

PART-1 - Hibernate Criteria和命名查询的工作原理如下:

标准适用于参数。 在运行时,查询不需要解析 - 有几个搜索和"在形式中存在"类似的 订购结果,将它们作为可滚动的等返回 Haven没有阅读/验证这一点,但标准依旧 字段上的索引(基于它们上设置的参数) 使一切更快。

因此,Criteria与普通HQL相比的优势 是它在执行期间的速度。

命名查询与HQL具有相同的优势 - 查询在启动时解析一次。然后执行 从应用程序中的任何需要。

PART-2 - 比较两者:

所以在这张照片中,

Criteria和named-queries如何相互比较?

标准适用于跨多个表的复杂查询 和多个参数 - 有优化的手段,从而使查询快速(?)

命名查询的优点是" define-once-use-everywhere"和 对于" light" queries-- 通常在一张桌子上使用少量参数进行较少复杂的搜索。频繁查询甚至更好。

注意:在其他一些讨论中看到了非常有用的Hibernate Criteria vs HQL: which is faster?

TIA。

2 个答案:

答案 0 :(得分:9)

根据表现,你不能选择其中一个。最后,无论如何它都变成了SQL查询,重要的是SQL查询的性能。

执行SQL查询的速度比解析HQL查询并将其转换为SQL要慢。因此,即使您没有使用命名查询,性能也不会显着恶化。

您可以根据功能和可读性选择HQL标准。

如果您想要可读的内容,请使用HQL查询。

如果您想基于各种可选的搜索条件动态撰写查询,那么Criteria API允许这样做,并且比动态编写HQL查询更方便。

答案 1 :(得分:5)

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

  1. 命名为HQL / JPAQL查询 - SQL生成只发生一次。
  2. 标准 - 生成前无需解析。
  3. (非命名)HQL / JPAQL查询 - 解析,然后生成。 也就是说,在我看来,选择基于解析和SQL生成开销的查询技术可能是一个错误。 与使用真实数据在真实数据库服务器上执行实际查询相比,此开销通常非常小。如果在分析应用程序时实际显示此开销,那么您可能应切换到命名查询。
  4. 在Criteria和HQL / JPAQL之间做出决定时,我会考虑以下事项:

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