查询、本机查询、命名查询和类型化查询之间的区别 [关闭]

Posted

技术标签:

【中文标题】查询、本机查询、命名查询和类型化查询之间的区别 [关闭]【英文标题】:Difference between query, native query, named query and typed query [closed] 【发布时间】:2016-01-19 02:43:14 【问题描述】:

查询、本机查询、命名查询和类型查询之间有什么区别? “独立”查询是否存在,或者它只是一个缩写?在我看来,原生查询是用简单的 sql 编写的查询,而命名查询与实体相关(休眠映射)。有人能简单解释一下吗?

【问题讨论】:

【参考方案1】:

查询

查询是指JPQL/HQL查询,其语法类似于通常用于执行DML语句(CRUD操作)的SQL。

在 JPA 中,您可以使用 entityManager.createQuery() 创建查询。您可以查看API 了解更多详情。

在 Hibernate 中,您使用 session.createQuery()"

NativeQuery

本机查询是指实际的 sql 查询(指实际的数据库对象)。这些查询是可以使用数据库客户端直接在数据库中执行的sql语句。

JPA : entityManager.createNativeQuery() Hibernate(非 JPA 实现):session.createSQLQuery()

命名查询

类似于常量的定义。 NamedQuery 是您通过为查询命名来定义查询的方式。您可以在休眠的映射文件中定义它,也可以在实体级别使用注释。

TypedQuery

TypedQuery 为您提供了在创建查询时提及实体类型的选项,因此此后的任何操作都不需要显式转换为预期类型。而普通的 Query API 不会返回您期望的确切类型的 Object 并且您需要强制转换。

【讨论】:

不同查询之间是否存在性能、吞吐量、内存消耗、负载应用服务器差异?我认为 NamedQuery 内存消耗大于查询,但我不能说选择支持一个或另一个的查询限制在哪里。你能解释一下吗?提前致谢 由于没有更好的地方来提及这一点,我要补充一点,将 Hibernate non-native 查询转换为本地查询时应该非常小心,特别是考虑到从本机查询返回时如何处理空值。我的团队最近看到了一些奇怪的 SQLGrammarException: could not extract ResultSetORA-00932: compatible datatypes: expected NUMBER got BINARY 错误,但未考虑潜在的空值。也许有人会偶然发现这条评论,并在知道这个小问题后更快地解决他们的问题。

以上是关于查询、本机查询、命名查询和类型化查询之间的区别 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

JPA 中的传递列表命名本机查询

jpa命名本机查询无结果

如何使用 JpaRepository 从 xml 中的命名本机查询返回 Map 作为结果

JPA将列表传递给命名本机查询中的IN子句

映射异常:在 JPA 2.0 中外部化命名本机查询时无法读取 XML

EclipseLink 拒绝将 PostgreSQL 上的本机查询映射到实体