要遍历的节点不能为空(Hibernate SQL)

Posted

技术标签:

【中文标题】要遍历的节点不能为空(Hibernate SQL)【英文标题】:node to traverse cannot be null (Hibernate SQL) 【发布时间】:2011-08-14 15:17:40 【问题描述】:

我正在通过 hibernate 执行 SQL 查询,如下所示:

SELECT thi 
FROM track_history_items thi 
JOIN artists art 
  ON thi.artist_id = art.id 
WHERE thi.type = "TrackBroadcast" 
GROUP BY art.name 
ORDER thi.createdAt DESC

但我收到“要遍历的节点不能为空!”的消息。有谁知道是什么原因造成的?

--编辑--

我很确定这个问题是由 artist_id 为空的可能性引起的。但是,我无法阻止这种情况,所以我可以跳过具有空艺术家 ID 的行 track_history_item 行吗?

【问题讨论】:

什么是休眠映射?和 java/hibernate 查询? 【参考方案1】:

要遍历的节点不能为空!

这是一条通用的 Hibernate 错误消息,表示您的查询中存在语法问题。再举一个例子,忘记用“SELECT”这个词开始一个选择子句会产生同样的错误。

在这种情况下,语法错误是由于 on 子句 - HQL 不支持它们。而是像这样进行交叉连接:

FROM track_history_items thi, artists art 
WHERE thi.type = "TrackBroadcast" 
AND  thi.artist_id = art.id 
GROUP BY art.name 
ORDER thi.createdAt DESC

【讨论】:

“Join without association in HQL”是一个类似的问题 - ***.com/questions/974085/…【参考方案2】:

此错误的出现通常是由于人们甚至无法想象的最愚蠢的原因之一。如果您对查询进行复制粘贴,则会引入一些特殊字符,并且您会开始收到此错误。确保您手动键入查询,它将正常工作。至少在我的情况下它起作用了。

【讨论】:

【参考方案3】:

我之前也多次遇到过这个问题,并且代码总是试图通过调用 createQuery 而不是 createNamedQuery 来运行命名查询,例如如果您有一个名为"FIND_XXX" 的命名查询,那么代码将调用entityManager.createQuery(FIND_XXX),这会导致它尝试执行表示命名查询名称的字符串,就好像它是标准动态查询字符串一样(这显然是一个问题)。

【讨论】:

【参考方案4】:

我只有在使用createQuery 而不是createNamedQuery 时才收到该错误。 所以当检测到这一点时,hibernate 会抛出异常。

Query query = entityManager.createQuery("DS.findUser");

【讨论】:

【参考方案5】:

如果执行有语法错误的查询,例如在更新语句中忘记逗号,也会出现此错误

update MyObject set field1=5 field2=4 WHERE id = 4

查看 field1=5 和 field2=4 之间如何缺少逗号?你会得到一个要遍历的节点不能为空错误。

【讨论】:

【参考方案6】:

如果您使用的是 Hibernate 4,您应该调用:

Query query = session.getNamedQuery(Entity.NAMED_QUERY);

而不是

Query query = session.createQuery(Entity.NAMED_QUERY);

这是因为session.createQuery 会尝试根据Entity.NAMED_QUERY 的字符串值创建查询,例如:

String NAMED_QUERY = "Entity.namedQuery";

导致不正确的 HQL 并引发异常。

【讨论】:

以上是关于要遍历的节点不能为空(Hibernate SQL)的主要内容,如果未能解决你的问题,请参考以下文章

二叉树遍历:考虑空节点

当未设置“hibernate.dialect”时,Hibernate 4 对 DialectResolutionInfo 的访问不能为空

当未设置“hibernate.dialect”时,Hibernate 4 对 DialectResolutionInfo 的访问不能为空

@ColumnDefault 的 HIbernate 列不能为空

org.hibernate.HibernateException:当未设置“hibernate.dialect”时,对 DialectResolutionInfo 的访问不能为空

org.hibernate.HibernateException:当未设置“hibernate.dialect”时,对 DialectResolutionInfo 的访问不能为空