узел для перемещения не может быть нулевым (Hibernate SQL)

Я выполняю 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

но я получаю сообщение, что «Node to traverse не может быть пустым!». Кто-нибудь знает, что может быть причиной этого?

- EDIT -

Я уверен, что эта проблема вызвана возможностью того, что artist_id будет null. Однако я не могу этого предотвратить, поэтому могу просто пропустить строки строки track_history_item, у которых есть null artist_id?

sql,hibernate,null,

22

Ответов: 5


33

У меня есть эта ошибка только потому, что я объявляю запрос Query = entityManager . createQuery ( "DS.findUser" ); вместо FROM track_history_items thi , художников art WHERE thi . type = "TrackBroadcast" И thi . artist_id = арт . id GROUP BY ст . имя ORDER thi . createdAt DESC . Поэтому, обнаруживая это, hibernate выбрасывает исключение

createQuery

31

узел для перемещения не может быть нулевым!

Это общее сообщение об ошибке Hibernate, указывающее на проблему синтаксиса в вашем запросе. В качестве другого примера, забыв начать предложение select со словом «SELECT», вы получите ту же ошибку.

В этом случае синтаксическая ошибка возникает из-за предложения on - HQL не поддерживает их. Вместо этого перекреститесь так:

createNamedQuery

19 ов

Я сталкивался с этой проблемой несколько раз и раньше, и всегда было так, что код пытался запустить именованный запрос, вызывая createQueryвместо него createNamedQuery, например, если у вас есть именованный запрос, "FIND_XXX"тогда код будет вызывать, entityManager.createQuery(FIND_XXX)что приводит к он пытается выполнить строку, представляющую имя именованного запроса, как если бы это был стандартный динамический запрос String (что, очевидно, является проблемой).


3

Эта ошибка возникает, как правило, из-за одной из самых глупых причин, о которых никто даже не думал. Если вы скопируете копию вставить запрос, появятся некоторые специальные символы, и вы начнете получать эту ошибку. Убедитесь, что вы вводите запрос вручную, и он будет работать нормально. По крайней мере, в моем случае это сработало.


0

Вы также можете получить эту ошибку, если вы выполните запрос с синтаксической ошибкой, например, забыли запятую в операторе обновления

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

Посмотрите, как пропадает запятая между полем 1 = 5 и поле2 = 4? Вы получите узел для перемещения не может быть пустой ошибкой.

SQL, спящий режим, пустой,
Похожие вопросы