我在一个使用JPA ORM的项目中工作,框架提供了两种创建查询的方法。
我理解要传递查询字符串的种类以使用它们,但我不确切地知道为什么我们需要创建本机查询?可能我们不想在那里使用ORM功能?
答案 0 :(得分:11)
除非您愿意,否则无需创建本机查询。 JPQL最终由框架转换为SQL,但框架也允许您调用本机查询。为什么要这样做:
答案 1 :(得分:9)
createQuery使用JPA自己的查询语言,您可以从类名而不是表名中进行选择。这不是SQL,它只是类似的,后来转换为真正的SQL。映射到java类将自动完成,并且将返回实际的类实例。
createNativeQuery使用真正的SQL,并且无法使用JPA功能。如果您需要执行JPA不支持的非常奇怪的操作,则通常使用此方法。将返回Object []列表,并且必须手动完成到java对象的映射。换句话说,它就像在JPA出现之前使用DB一样,只是稍微方便一点,因为连接处理是自动完成的。
答案 2 :(得分:4)
我已将它用于优化目的。使用Native查询意味着ORM映射不到位,而不是JPQL,您使用DB的本机语法。所以,正如@RasmusFranke也指出的那样,如果你需要一些JPA不支持的东西(就像你想要使用DB供应商特定的扩展,这在概念上是一个坏主意,因为JPA完全是与数据库无关,但仍然发生我知道......)
这样做的另一个影响是,通过使用本机查询,只运行提供的查询。不急于获取其他实体或其他不需要的东西。这样,如果处理大量对象,就可以节省一些堆空间。