JPA - pesquisa N x 1

6 respostas
M

Prezados amigos.

Tenho o seguinte relacionamento:

Curso(1) —> (n)Turma (1) —> (n)alunos

Gostaria de fazer um filtro sobre alunos de uma determinada turma (por exemplo, encontrar aqueles que começam com a letra "A", mas que pertencem somente a turma "X"). Existe uma forma de escrever uma NamedQuery para isso na minha entidade Aluno? Ou como eu poderia fazer isso?

Atenciosamente,

Marcos.

6 Respostas

fiaux

Sabe fazer em SQL? Transforme para HQL.

M

Tens um exemplo em HQL? Na verdade estava tentando fazer uma instrução a partir de uma NamedQuery da JPA, o que não foi possível.

fiaux

ops… está usando hibernate?

M

Sim. JPA com Hibernate. Só que estou usando somente classes e métodos da JPA (javax.persistence.). Será que é possível fazer isto que estou tentando? Na verdade eu já fiz algo com NamedNativeQueries, o que exige um mapeamento para SqlResultSetMapping. Isto exige a escrita manual de todo o mapeamento das Entidades envolvidas. Assim, estou tentando fazer algo que seja mais simples (como em uma NamedQuery). Entendeu?

A

Talvez algo do tipo (escrevi aqui, n testei…) :slight_smile:

@NamedQuery(name = "Aluno.findByNomeAlunoIdTurma", query = "select a from Aluno a join Turma t where a.nome = :nomeAluno and t.idTurma = :idTurma") @Entity class Aluno{ //... }

M

Alan,

Sua resposta ajudou muito. Apenas tive que fazer um pequeno ajuste na instrução. Trata-se da declaração do JOIN, onde, ao invez de colocar diretamente o nome da tabela, devemos usar o atributo da classe. Assim, se na classe Aluno tivermos um atributo do tipo Turma, então é necessário usar este atributo na declaração JOIN a partir da referência de Aluno, neste exemplo o Aluno a. Abaixo, o código de exemplo:

@NamedQuery(name = "Aluno.findByNomeAlunoIdTurma", query = "select a from Aluno a join a.turma t where a.nome = :nomeAluno and t.idTurma = :idTurma")  
@Entity  
class Aluno{  
//...
     Turma turma;  
//...
}
Criado 8 de setembro de 2008
Ultima resposta 24 de set. de 2008
Respostas 6
Participantes 3