为什么我们需要创建本机查询?

Var*_*pta 7 java orm jpa

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

  • entityManager.createQuery(QUERY1);
  • entityManager.createNativeQuery(QUERY2);

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

m3t*_*man 11

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

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


Ras*_*nke 9

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

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


ppe*_*rka 5

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

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