开发者

node to traverse cannot be null (Hibernate SQL)

I'm performing a SQL query through hibernate, which looks like:

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

but I'm getting the message that开发者_如何学JAVA 'Node to traverse cannot be null!'. Anyone know what could be causing this?

--EDIT--

I'm pretty sure that this problem is being caused by the possibility of artist_id to be null. However, I can't prevent this, so can I just skip the rows track_history_item rows which have a null artist_id?


I have gotten that error only when using createQuery instead of createNamedQuery. So when detecting this, hibernate throws the exception.

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


node to traverse cannot be null!

This is a generic Hibernate error message indicating a syntax problem in your query. As another example, forgetting to start a select clause with the word "SELECT" would yield the same error.

In this instance the syntax error is due to the on clause - HQL does not support them. Instead do a cross join like so:

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


I have come across this issue several times before as well and it has always been the case that the code was attempting to run a named query by calling createQuery instead of createNamedQuery, e.g. if you have a named query named "FIND_XXX" then the code would be calling entityManager.createQuery(FIND_XXX) which results in it trying to execute the String representing the name of the named query as if it was a standard dynamic query String (which is obviously a problem).


You can also get this error if you execute a query that has a syntax error, such as forgetting a comma in an update statement

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

See how there is a missing comma between field1=5 and field2=4? You will get a node to traverse cannot be null error.


This error comes usually due to one of the most stupid reason that one would not have even imagined. If you dop copy-paste the query, some special characters get introduced and you start getting this error. Make sure you type the query manually and it will work fine. Atleast in my case it worked.


If you are using Hibernate 4 you should be calling:

Query query = session.getNamedQuery(Entity.NAMED_QUERY);

instead of

Query query = session.createQuery(Entity.NAMED_QUERY);

This happens because session.createQuery will try to create the query based on the string value of Entity.NAMED_QUERY for example:

String NAMED_QUERY = "Entity.namedQuery";

resulting in a incorrect HQL and raising a exception.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜