Path expected for join! en Hibernate

Al intentar hacer una consulta en HQL usando un join como en el siguiente ejemplo:

From Persona per inner join Direccion dir
Hibernate devuelve una excepción con el texto Path expected for join!

Causa

El error se debe a que estamos intentando hacer el join de una manera “demasiado” similar a cómo se hace en ANSI SQL, donde sólo indicamos las tablas que participan del join y luego damos la equivalencia de columnas sobre las cuales hacer la relación ocupando un “on”, como en el ejemplo:

select * from Persona inner join Direccion on Persona.direccionID=Direccion.ID

Dicho de otra manera, es un error de sintaxis nuestro.

Solución

En HQL esto es algo distinto. En lugar de usar el “on” (o en el caso de SQL Server directamente poner la igualdad), debemos indicar en el join cuál es el camino del join. La consulta anterior debiera quedar así:

From Persona per inner join per.direccion

De esta forma, indicamos que el camino a seguir para el join es a través de la propiedad “direccion” de la clase Persona. A continuación pueden agregarse las condiciones para limitar el espectro de búsqueda.

De paso, si se desea obtener sólo las personas que cumplan cierta condición aprovechada por el join evitando traer de la base de datos las direcciones, debemos agregar un select al principio, de la siguiente forma:

select distinct per From Persona per inner join per.direccion

Esto devolverá sólo instancias de Personas, en lugar de la combinación efectiva de ambas clases. El distinct, al igual que su contraparte ANSI SQL permite traer sólo instancias distintas.