node to traverse cannot be null (Hibernate SQL)

2019-03-22 18:18发布

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?

5条回答
走好不送
2楼-- · 2019-03-22 18:42

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楼-- · 2019-03-22 18:44

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.

查看更多
欢心
4楼-- · 2019-03-22 18:49

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楼-- · 2019-03-22 19:00

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

查看更多
Fickle 薄情
6楼-- · 2019-03-22 19:07

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");
查看更多
登录 后发表回答