INNER em HQL

Bom dia amigos. Estou com um problema para fazer um HQL no meu projeto WEB.

Nunca tinha trabalhado com JAVA WEB, tampouco com HQL, mas faz parte da vida.

O JOIN é simples, mas estou tomando um erro atrás do outro desde segunda-feira.

Estou mandando a parte do JOIN que está fazendo no DAO, o atributo que fiz JOIN na Classe de Usuário e da Classe de Programas.

====JOIN====
Query query = em.createQuery(
[color=blue] "SELECT U.numChapa "
+ "FROM Usuarios U "
+ "INNER JOIN FETCH Programas as P "
+ "INNER JOIN FETCH Modulos as M "
+ “WHERE UPPER(U.numChapa) = :numChapa”[/color])
.setParameter(“numChapa”, usuario.getNumChapa().toUpperCase());

====JOINs da Classe Usuários====
[color=darkred]@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(name = “USUARIOS_PROGRAMAS_1T”, joinColumns = { @JoinColumn(name = “ID_USUARIO”) }, inverseJoinColumns = { @JoinColumn(name = “ID_PROGRAMA”) })
@ForeignKey(name = “FK_USU_PROG_ID_PROGRAMA”)[/color]
private List programa;

====JOINs da Classe Programas====
[color=darkred]@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(name = “USUARIOS_PROGRAMAS_1T”, joinColumns = { @JoinColumn(name = “ID_PROGRAMA”) }, inverseJoinColumns = { @JoinColumn(name = “ID_USUARIO”) })
@ForeignKey(name = “FK_USU_PROGR_ID_USUARIO”)[/color]
private List usuarios;

[color=darkred]@ManyToOne
@JoinColumn(name = “ID_MENU”, nullable = false, updatable = false)
@ForeignKey(name = “FK_PROGRAMA_ID_MENU”)[/color]
private Modulos idMenu;

[quote=marconny]…
O JOIN é simples, mas estou tomando um erro atrás do outro desde segunda-feira.

[/quote]
Ahan…
E quer que a gente adivinhe quais erros estão sendo apresentados?

Outra coisa, nunca vi na vida esse tal de INNER JOIN FETCH, quando se usa isso?

marconny, você não precisa especificar os joins no HQL o proprio Hibernate vai fazer pra você através do mapeamento que já fez na entidade usando as Annotations @ManyToMany, @ManyToOne, enfim…
Sua consulta ficará da seguinte forma;

   Query query = em.createQuery(
"SELECT U.numChapa "
+ "FROM Usuarios U "
+ "WHERE UPPER(U.numChapa) = :numChapa")
.setParameter("numChapa", usuario.getNumChapa().toUpperCase()); 

Qualquer dúvida posta aí.

[quote=Big E]marconny, você não precisa especificar os joins no HQL o proprio Hibernate vai fazer pra você através do mapeamento que já fez na entidade usando as Annotations @ManyToMany, @ManyToOne, enfim…
Sua consulta ficará da seguinte forma;

   Query query = em.createQuery(
"SELECT U.numChapa "
+ "FROM Usuarios U "
+ "WHERE UPPER(U.numChapa) = :numChapa")
.setParameter("numChapa", usuario.getNumChapa().toUpperCase()); 

Qualquer dúvida posta aí.[/quote]

Grande Big E, obrigado pela orientação no tópico de INNER com HQL.

Seguinte, fiquei na dúvida de como referenciar campos de outra classe.

Por exemplo, e se fosse:

[color=blue]SELECT U.numChapa, P.descricao, M.descricao "

  • "FROM Usuarios U "
  • "INNER JOIN Programas as P "
  • "INNER JOIN Modulos as M "
  • “WHERE UPPER(U.numChapa) = :numChapa”) [/color]

Como eu faria diretamente via os @ManyToMany, @ManyToOne, enfim… ???

marconny, nesse caso você especificaria o join para poder ter acesso a uma referência na sua query da seguinte forma (quase como você havia feito, só não precisa descrever o inner):

PS. O exemplo abaixo estou levando em consideração que os atributos mapeados estão na classe Usuarios que você criou.


//Uma sugestão é melhorar o nome de seus atributos e classes, por exemplo no mapeamento com Modulos (procure um nome de classe sempre no singular), utilize o nome modulo que irá  
// referenciar o objeto Modulos e não apenas o seu ID (idMenu)

Query query = em.createQuery("SELECT U.numChapa, P.descricao, U.idMenu.descricao "
+ "FROM Usuarios U "
+ "JOIN FETCH U.programa as P "
+ "WHERE UPPER(U.numChapa) = :numChapa");

Porém tenha em mente que dessa forma o retorno será um array de Object, necessitando percorrer a lista e tratar os valores retornados.

Big E, muito obrigado.

A única alteração que tive de fazer, não sei o porquê, foi utilizar apenas o JOIN ao invés de JOIN FETCH.

No mais ocorreu perfeitamente. Vou revisar as classes, e muito obrigado pela dica e ajuda.