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

tis*_*was 25 sql null hibernate

我正在通过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
Run Code Online (Sandbox Code Playgroud)

但我收到的消息是"节点遍历不能为空!".有人知道是什么原因引起的吗?

- 编辑 -

我很确定这个问题是由于artist_id为null的可能性造成的.但是,我无法阻止这种情况,所以我可以跳过具有null artist_id的行track_history_item行吗?

小智 38

我有这个错误只是因为我声明了createQuery而不是createNamedQuery.所以当检测到这个时,hibernate会抛出异常

    Query query = entityManager.createQuery("DS.findUser");
Run Code Online (Sandbox Code Playgroud)


小智 33

要遍历的节点不能为空!

这是一个通用的Hibernate错误消息,指示查询中的语法问题.再举一个例子,忘记用"SELECT"一词启动一个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
Run Code Online (Sandbox Code Playgroud)


bre*_*777 19

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


Gan*_*alf 5

如果您执行有语法错误的查询,例如忘记更新语句中的逗号,您也可能会收到此错误

update MyObject set field1=5 field2=4 WHERE id = 4
Run Code Online (Sandbox Code Playgroud)

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