node to traverse cannot be null (Hibernate SQL)

2019-03-22 18:34发布

问题:

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 '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?

回答1:

I have got that error only because I was declaring a createQuery instead of createNamedQuery. So When detecting this, hibernate throw the exception

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


回答2:

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


回答3:

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).



回答4:

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.



回答5:

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.