我正在通过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吗?
答案 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并引发异常。