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

时间:2011-04-28 11:20:40

标签: sql hibernate null

我正在通过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为null的可能性引起的。但是,我无法阻止这种情况,所以我可以跳过具有null artist_id的行track_history_item吗?

6 个答案:

答案 0 :(得分:36)

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

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

答案 1 :(得分:31)

  

要遍历的节点不能为空!

这是一个通用的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

答案 2 :(得分:19)

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

答案 3 :(得分:3)

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

答案 4 :(得分:3)

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

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

看看field1 = 5和field2 = 4之间缺少逗号吗?您将获得要遍历的节点不能为空错误。

答案 5 :(得分:0)

如果您使用的是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并引发异常。