Hibernate - Criteria vs命名查询

Roa*_*oam 2 orm hibernate criteria named-query

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

我试图将Q分为两部分,并在两者上寻找验证/更正:

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

标准适用于参数.在运行时,查询不需要解析 - 有几个搜索和"存在形式"参数,如命令结果,返回它们可滚动等.没有读取/验证这一点,但Criteria工作的字段索引(根据它们设置的参数)使速度更快.

因此,与普通HQL相比,Criteria的优势在于它在执行过程中的速度.

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

第2部分 - 比较两者:

所以在这张照片中,

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

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

命名查询具有"定义一次使用 - 无处不在"的优点,并且对于"轻量级"查询非常好 - 通常在单个表上具有少量参数的较不复杂的搜索.频繁查询甚至更好.

注意:看到非常有用的Hibernate Criteria vs HQL:哪个更快?在其他一些讨论中.

TIA.

JB *_*zet 9

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

执行SQL查询的速度比解析HQL查询并将其转换为SQL要慢.因此,即使您不使用命名查询,性能也不会明显变差.

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

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

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


Sag*_*nda 6


理论上,标准应该比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,您不需要这样做.
  • HQL/JPAQL可以用于大多数其他事情,因为代码往往更小,更容易让开发人员理解.
  • 如果使用HQL,则可以将频繁查询转换为命名查询.经过一些剖析后,我宁愿稍后再这样做.