0

根据最新的Hibernate 文档第 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 用户指南第 17.3 节也说了同样的话:

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

1 回答 1

0

啊哈!答:不,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”的表,所以当它尝试执行查询时它失败了。

于 2017-09-18T23:16:48.420 回答