JPA - pesquisa N x 1

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.

Sabe fazer em SQL? Transforme para HQL.

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.

ops… está usando hibernate?

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?

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{ //... }

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;  
//...
}