【问题标题】:node to traverse cannot be null (Hibernate SQL)要遍历的节点不能为空(Hibernate SQL)
【发布时间】:2026-01-28 02:40:01
【问题描述】:

我正在通过 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 查询?

标签: sql hibernate null


【解决方案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

【讨论】:

【解决方案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 并引发异常。

          【讨论】: