INNER em HQL

5 respostas
M

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;

5 Respostas

drsmachado

marconny:

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


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?

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í.

M

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í.

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… ???

Big_E

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.

M

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.

Criado 9 de maio de 2012
Ultima resposta 9 de mai. de 2012
Respostas 5
Participantes 3