标准与JPQL或HQL

使用Criteria或HQL有什么优点和缺点? Criteria API是在Hibernate中表达查询的一种很好的面向对象的方式,但有时候Criteria Queries比HQL更难理解/构建。

您何时使用Criteria和何时使用HQL? 你更喜欢哪些用例? 或者这只是一个品味问题?


我大多更喜欢Criteria Queries查询动态查询。 例如,动态添加某些排序或者根据某些参数留下一些部分(例如限制)会更容易。

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


HQL和criteriaQuery之间在性能上存在差异,每次使用criteriaQuery启动查询时,它都会为表名称创建一个新的别名,该名称不会反映在任何数据库的上次查询缓存中。 这导致编译生成的SQL的开销,需要更多的时间来执行。

关于获取策略[http://www.hibernate.org/315.html]

  • 标准尊重映射中的懒惰设置,并保证您要加载的内容。 这意味着一个Criteria查询可能会导致几个SQL立即SELECT语句使用所有非惰性映射关联和集合来获取该子图。 如果你想改变“how”甚至“what”,使用setFetchMode()来启用或禁用特定集合或关联的外部联接抓取。 标准查询也完全遵守获取策略(join vs select和subselect)。
  • HQL尊重映射中的懒惰设置,并确保您要加载的内容已加载。 这意味着一个HQL查询可能会导致几个SQL立即SELECT语句获取带有所有非惰性映射关联和集合的子图。 如果要更改“如何”甚至“什么”,请使用LEFT JOIN FETCH为特定集合启用外部联接提取,或者可以为空或多对一或一对一关联,或者使用JOIN FETCH启用内部联合抓取获取不可空的多对一或一对一关联。 HQL查询不考虑映射文档中定义的任何fetch =“join”。

  • Criteria是一个面向对象的API,而HQL意味着字符串连接。 这意味着所有面向对象的好处都适用:

  • 所有其他条件相同的情况下,OO版本不太容易出错。 任何旧的字符串都可以附加到HQL查询中,而只有有效的Criteria对象才能将其添加到Criteria树中。 有效地,标准类更加受限制。
  • 使用自动完成功能时,面向对象更容易被发现(因此对于我来说更容易使用,至少)。 您不一定需要记住查询的哪些部分在哪里; IDE可以帮助你
  • 你也不需要记住语法的细节(比如哪个符号在哪里)。 所有你需要知道的是如何调用方法和创建对象。
  • 由于HQL非常像SQL(大多数开发人员已经非常了解),因此这些“不必记住”的参数不会带来太多的重量。 如果HQL更加不同,那么这将更加重要。

    链接地址: http://www.djcxy.com/p/36971.html

    上一篇: Criteria vs. JPQL or HQL

    下一篇: SQL Exception while connecting to oracle 11g from web application using jdbc