我试图将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。
答案 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生成开销而言,我们有:
在Criteria和HQL / JPAQL之间做出决定时,我会考虑以下事项: