узел для прохождения не может быть нулевым (Hibernate SQL) - PullRequest
24 голосов
/ 28 апреля 2011

Я выполняю SQL-запрос через Hibernate, который выглядит следующим образом:

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

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

- EDIT -

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

Ответы [ 5 ]

37 голосов
/ 25 марта 2014

Я получил эту ошибку только потому, что объявлял createQuery вместо createNamedQuery . Поэтому при обнаружении этого hibernate выдает исключение

    Query query = entityManager.createQuery("DS.findUser");
32 голосов
/ 30 ноября 2012

узел для обхода не может быть пустым!

Это общее сообщение об ошибке Hibernate, указывающее на синтаксическую проблему в вашем запросе.В качестве другого примера, если вы забудете запустить предложение select со словом «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
19 голосов
/ 18 марта 2013

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

3 голосов
/ 07 июля 2018

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

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

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

3 голосов
/ 19 декабря 2012

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

...