sqlquery - El nodo a atravesar no puede ser nulo(Hibernate SQL)
sql query hibernate mapping example (5)
Estoy realizando una consulta SQL a través de hibernación, que se parece a:
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
pero recibo el mensaje de que ''¡El nodo que atraviesa no puede ser nulo!''. Alguien sabe que podría estar causando esto?
- EDITAR -
Estoy bastante seguro de que este problema se debe a la posibilidad de que artist_id sea nulo. Sin embargo, no puedo evitar esto, así que ¿puedo omitir las filas track_history_item filas que tienen un artist_id nulo?
¡El nodo a atravesar no puede ser nulo!
Este es un mensaje de error genérico de Hibernate que indica un problema de sintaxis en su consulta. Como otro ejemplo, si olvida iniciar una cláusula de selección con la palabra "SELECCIONAR", se producirá el mismo error.
En este caso, el error de sintaxis se debe a la cláusula on: HQL no los admite. En lugar de hacer una unión cruzada de esta manera:
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
Este error suele deberse a una de las razones más estúpidas por las que uno no se habría imaginado. Si dop copia y pega la consulta, se introducen algunos caracteres especiales y comienza a recibir este error. Asegúrese de que escribe la consulta manualmente y funcionará bien. Al menos en mi caso funcionó.
También me he topado con este problema varias veces y siempre fue así como el código intentaba ejecutar una consulta con nombre llamando a createQuery
lugar de createNamedQuery
, por ejemplo, si tiene una consulta con nombre llamada "FIND_XXX"
entonces el código puede llamar a entityManager.createQuery(FIND_XXX)
que hace que intente ejecutar la Cadena que representa el nombre de la consulta nombrada como si fuera una Cadena de consulta dinámica estándar (que obviamente es un problema).
También puede obtener este error si ejecuta una consulta que tiene un error de sintaxis, como olvidar una coma en una declaración de actualización
update MyObject set field1=5 field2=4 WHERE id = 4
¿Ves cómo falta una coma entre campo1 = 5 y campo2 = 4? Obtendrá un nodo para atravesar no puede ser un error nulo.
Tengo ese error solo porque estaba declarando createQuery en lugar de createNamedQuery . Así que al detectar esto, hibernate lanza la excepción.
Query query = entityManager.createQuery("DS.findUser");