要遍历的节点不能为空(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 的访问不能为空