9

我在一个使用 JPA ORM 的项目中工作,框架提供了两种创建查询的方法。

  • entityManager.createQuery(query1);
  • entityManager.createNativeQuery(query2);

我知道要传递各种查询字符串以使用它们,但我不知道为什么我们需要创建本机查询?可能我们不想在那里使用 ORM 功能?

4

3 回答 3

14

除非您愿意,否则您不需要创建本机查询。JPQL 最终由框架翻译成 SQL,但框架也允许您调用本机查询。为什么要这样做:

  • 低级访问,这意味着您可以自己优化和处理映射;使用 SQL,您实际上访问数据库表,而使用 JPQL,您访问实体对象;
  • 如果您已经了解 SQL,也许您不想学习 JPQL
  • 您已经有用 SQL 编写的查询,并且没有资源/时间将它们移植到 JPQL
于 2012-11-08T11:50:15.470 回答
10

createQuery 使用 JPA 自己的查询语言,您可以从类名而不是表名中进行选择。这不是 SQL,它只是类似,后来被转换为真正的 SQL。映射到 java 类将自动完成,实际的类实例将作为结果返回。

createNativeQuery 使用真正的 SQL,将无法使用 JPA 功能。如果您需要做一些 JPA 不支持的非常奇怪的事情,通常会使用此方法。将返回一个 Object[] 列表,并且必须手动完成到 java 对象的映射。换句话说,它就像在 JPA 出现之前使用数据库一样,只是稍微方便一些,因为连接处理是自动完成的。

于 2012-11-08T11:46:21.357 回答
5

我已将其用于优化目的。使用本机查询意味着 ORM 映射没有到位,您使用数据库的本机语法而不是 JPQL。因此,正如@RasmusFranke 还指出的那样,如果您需要 JPA 不支持的东西(例如当您想使用 DB 供应商特定的扩展时,这在概念上是一个坏主意,因为 JPA 完全是与 DB 无关的,但仍然会发生。 我知道...)

这样做的另一个效果是,通过使用本机查询,只运行提供的查询。无需急切地获取其他实体或其他不需要的东西。这样,如果你处理大量的对象,你可以节省一些堆空间。

于 2012-11-08T11:50:45.500 回答