关于 JPA NamedNativeQuery 编译

Posted

技术标签:

【中文标题】关于 JPA NamedNativeQuery 编译【英文标题】:About JPA NamedNativeQuery compilation 【发布时间】:2018-09-19 08:57:01 【问题描述】:

@NamedNativeQuery 中指定的 sql 查询是否像 JPA 中的 @NamedQuery 一样预编译?我问这个是因为我找不到任何说明它是或不是的东西。

【问题讨论】:

这不是直接的问题,但它可能有助于观点***.com/questions/27565706/… 【参考方案1】:

@NamedQuery "pre-compilation" 基本上是提前翻译成原生查询语言(通常是 SQL),所以你可以在应用程序启动/第一次使用时只做一次,而不是每次您发出查询。

@NamedNativeQuery 查询已经用本地查询语言编写,因此从这个意义上说,它们是“本质上”预编译的。

【讨论】:

"查询已经用本地查询语言编写":不一定是真的。例如docs.jboss.org/hibernate/orm/current/userguide/html_single/… Hibernate 提供了这种别名引用,需要根据实体定义进行额外的翻译。 (但是我真的不知道它是否会为@NamedNativeQuery 进行预编译:P) @Adrian Shum Hibernate 原生查询!= JPA 原生查询【参考方案2】:

对带有@NamedNativeQuery 注释的查询执行的预处理量取决于 JPA 提供程序,但是您不应该假设发生了很多事情,因为查询是底层数据库的本机,所以在JPA 级别。如果您正在调用存储过程或特定于数据库的 JPA 不知道的东西,情况尤其如此。没有从 JPQL 到 SQL 的翻译。

幕后可能会发生一些针对那些命名查询的预准备语句的优化。但这取决于 JPA 提供程序及其与特定数据库的 JDBC 驱动程序的交互级别。

【讨论】:

以上是关于关于 JPA NamedNativeQuery 编译的主要内容,如果未能解决你的问题,请参考以下文章

JPA 2.0 本机查询结果映射到 Bean

Eclipselink NamedNativeQuery 将列名作为参数而不是值传递

Spring Data JPA实战视频教程

JPA 2.1 - 无法调用 Oracle 函数

@NamedQuery 优于 @NamedNativeQuery

Spring Pageable NamedNativeQuery