ERROR HQL: Ruta esperada para unirse

100

Sigo probando variaciones de esta consulta y parece que no puedo hacer que esto suceda. También hice referencia a esta publicación: ¡ Ruta esperada para unirse! Error de Nhibernate y parece que no puedo aplicar la misma lógica a mi consulta. Mi Userobjeto tiene una UserGroupcolección.

Entiendo que la consulta necesita hacer referencia a entidades dentro del objeto, pero por lo que veo, soy ...

@NamedQuery(
  name = "User.findByGroupId",
  query =
    "SELECT u FROM UserGroup ug " +
    "INNER JOIN User u WHERE ug.group_id = :groupId ORDER BY u.lastname"
)
Webnet
fuente

Respuestas:

131
select u from UserGroup ug inner join ug.user u 
where ug.group_id = :groupId 
order by u.lastname

Como una consulta con nombre:

@NamedQuery(
  name = "User.findByGroupId",
  query =
    "SELECT u FROM UserGroup ug " +
    "INNER JOIN ug.user u WHERE ug.group_id = :groupId ORDER BY u.lastname"
)

Utilice rutas en la declaración HQL, de una entidad a otra. Consulte la documentación de Hibernate sobre HQL y combinaciones para obtener más detalles.

JB Nizet
fuente
32
¿Qué es un "camino"? Busqué en la documentación de HQL pero no encontré una definición.
gwg
7
significa que necesita vincular las entidades: en su ejemplo anterior, observe cómo pone ug.user u. Sin el ug antes, obtendría el error. Además, el 'usuario' en 'ug.user u' debería ser el nombre del campo en la clase UserGroup.
Lawrence
6
Esta sintaxis de HQL es molesta. Tuve que encontrar muchos ejemplos y encontré el tuyo.
Bằng Rikimaru
Entonces, ¿no puedo unir entidades "manualmente" sin un mapeo explícito (campo que se usará para unir) declarado con la Entidad?
Sr. Anderson
67

Debe nombrar la entidad que tiene la asociación a Usuario. Por ejemplo,

... INNER JOIN ug.user u ...

Esa es la "ruta" de la que se queja el mensaje de error: ruta desde UserGroup a la entidad User.

Hibernate se basa en JOIN declarativos, para los cuales la condición de combinación se declara en los metadatos de mapeo. Por eso es imposible construir la consulta SQL nativa sin tener la ruta.

Marko Topolnik
fuente
13
Finalmente, alguien que respondió a la raíz del problema ... (la necesidad de prefijar una tabla externa con un alias existente) resolvió mi problema, ¡muchas gracias!
Saad Benbouzid
6
¿Qué pasa si: no hizo una asociación en la Entidad y simplemente guardó algo como 'Long userId;'
Spektakulatius