ERRO HQL: caminho esperado para junção

100

Eu continuo tentando variações desta consulta e não consigo fazer isso acontecer. Eu também mencionei esta postagem: Caminho esperado para participar! Erro Nhibernate e não consigo aplicar a mesma lógica à minha consulta. Meu Userobjeto tem uma UserGroupcoleção.

Eu entendo que a consulta precisa fazer referência a entidades dentro do objeto, mas pelo que estou vendo, estou ...

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

Respostas:

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

Como uma consulta nomeada:

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

Use caminhos na instrução HQL, de uma entidade para outra. Veja a documentação do Hibernate sobre HQL e junções para detalhes.

JB Nizet
fonte
32
O que é um "caminho"? Pesquisei a documentação HQL, mas não encontrei uma definição.
gwg
7
significa que você precisa vincular as entidades: em seu exemplo aqui acima, observe como ele coloca ug.user u. Sem o ug antes dele, você obteria o erro. Além disso, o 'usuário' em 'ug.user u' deve ser o nome do campo na classe UserGroup!
Lawrence
6
Essa sintaxe HQL é irritante. Tive que encontrar muitos exemplos e encontrei o seu.
Bằng Rikimaru
Então, não posso unir entidades "manualmente" sem mapeamento explícito (campo a ser usado para unir) declarado com a Entidade?
Sr. Anderson
67

Você precisa nomear a entidade que mantém a associação ao usuário. Por exemplo,

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

Esse é o "caminho" sobre o qual a mensagem de erro está reclamando - caminho do Grupo de usuários para a entidade Usuário.

O Hibernate depende de JOINs declarativos, para os quais a condição de junção é declarada nos metadados de mapeamento. É por isso que é impossível construir a consulta SQL nativa sem ter o caminho.

Marko Topolnik
fonte
13
Finalmente alguém respondendo a raiz do problema ... (a necessidade de prefixar tabela estrangeira com alias existente) resolveu meu problema, muito obrigado!
Saad Benbouzid
6
E se: você não fez uma associação na Entidade e apenas salvou algo como 'Long userId;'
Spektakulatius