Hibernate 5 中的 NativeQuery 调用是不是仍支持 HQL?

Posted

技术标签:

【中文标题】Hibernate 5 中的 NativeQuery 调用是不是仍支持 HQL?【英文标题】:Is HQL still supported in NativeQuery calls in Hibernate 5?Hibernate 5 中的 NativeQuery 调用是否仍支持 HQL? 【发布时间】:2017-09-17 23:09:18 【问题描述】:

根据最新的Hibernate docs section 17.3,这应该可以:

List<Person> persons = session.createNativeQuery(
        "SELECT * FROM Person", Person.class)
    .getResultList();

我有一个几乎相同的查询,但我遇到了一个异常:

java.sql.SQLException: Invalid object name 'Person'

我正在使用 hibernate-core-5.2.10.FINAL。 单步执行源代码后,它永远不会像普通 HQL 查询那样分支查看实体图。

还有人看到这个吗?我可以为好奇的人发布更多详细信息,并会在我继续调试时添加更多内容...

我在将 Hibernate 降级到 5.0.12 后运行了相同的查询,结果相同。虽然,在 Hibernate 5.0 中,会话中没有“nativeQuery”方法,但它是“createSQLQuery”,它创建了一个“SQLQuery”对象。 Hibernate 5.0 Users Guide section 17.3 也是这么说的:

List<Person> persons = session.createSQLQuery(
        "SELECT * FROM person" )
    .addEntity( Person.class )
    .list();

【问题讨论】:

也许可以分享查询。几乎相同是有点矛盾...... 真的!致力于在旧版本的 Hibernate 中进行复制。可能我正在尝试做一些从未被支持的事情。我会尽快发布更多细节。不过感谢您的评论。 【参考方案1】:

啊哈!答:不,Hibernate NativeQuery 调用中从不支持 HQL。

我误解了文档。当我读到

("SELECT * FROM Person", Person.class)

...作为 createNativeQuery 的参数,我假设大写的“Person”是一个实体,并将映射到 Person.class 中指定的任何表名。情况并非如此,而且从未如此。 createNativeQuery() 方法的行为与旧的 createSQLQuery() 方法相同,只是将您的查询字符串原样引入数据库,而无需在下行过程中进行实体映射转换。

您指定第二个类参数的唯一原因是在您提供的查询完成并返回结果后,将 ResultSet 变量编组回对象。在带有小写“人”的旧文档中更清楚:

"SELECT * FROM person"

...但不是很清楚,尽管 Hibernate 文档仍然比许多其他库的文档好。

无论如何,NativeQuery(s) 就像旧的 SQLQuery(s),只是执行本地 sql 并尝试帮助您编组 ResultSet(s)。

哦,还有个例外!为什么我得到了异常?因为我的 Person 类没有映射到一个名为“Person”的表,所以当它尝试执行查询时失败了。

【讨论】:

以上是关于Hibernate 5 中的 NativeQuery 调用是不是仍支持 HQL?的主要内容,如果未能解决你的问题,请参考以下文章

JPA 2.1 中的 @ConstructorResult 映射不能与 Hibernate 4.3.5.Final 一起正常工作

hibernate框架学习笔记5:缓存

Hibernate——5.2配置

Hibernate环境搭建

Spring和Hibernate的注解整合 hibernate3和hibernate4/5的区别

如何使用 Hibernate 5 正确创建 JPQL 查询(不推荐使用查询类型)