Tenho o simples cenário:
@Entity
public class Turma {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@Column(length = 20, nullable = false)
private String nome;
@OneToMany(cascade = CascadeType.ALL,
mappedBy = "turma", fetch = FetchType.EAGER)
private List<Aluno> alunos;
public Turma() {
}
public Turma(String nome) {
this.nome = nome;
}
public Integer getId() {
return id;
}
public String getNome() {
return nome;
}
public List<Aluno> getAlunos() {
return alunos;
}
public void addAluno(Aluno aluno) {
if (this.alunos == null) {
this.alunos = new ArrayList<>();
}
this.alunos.add(aluno);
aluno.setTurma(this);
}
}
@Entity
public class Aluno {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@Column(length = 50, nullable = false)
private String nome;
@Column(length = 35, nullable = false)
private String email;
@ManyToOne
@JoinColumn(name = "turma_id")
private Turma turma;
public Aluno() {
}
public Aluno(String nome, String email) {
this.nome = nome;
this.email = email;
}
public Integer getId() {
return id;
}
public String getNome() {
return nome;
}
public String getEmail() {
return email;
}
public Turma getTurma() {
return turma;
}
public void setTurma(Turma turma) {
this.turma = turma;
}
}
O banco de dados assim:


E os seguintes registros:


Gostaria de mostrar a turma Java com todos os alunos que tenha email "mari@gmail.com" … ou seja, espero ter a turma Java com a lista de alunos preenchida apenas com a Mariazinha…
Ai fiz assim:
CriteriaBuilder builder = HibernateUtil.getSession().getCriteriaBuilder();
CriteriaQuery<Turma> query = builder.createQuery(Turma.class);
Root<Turma> from = query.from(Turma.class);
Join<Turma, Aluno> aluno = from.join("alunos");
TypedQuery<Turma> typedQuery = HibernateUtil.getSession().createQuery(
query.select(from).where(
builder.and(
builder.equal(aluno.get("email"),"mari@gmail.com")
)
)
);
List<Turma> list = typedQuery.getResultList();
Os SQLs gerados pelo Hibernate foram:
select
turma0_.id as id1_3_,
turma0_.nome as nome2_3_
from
Turma turma0_
inner join
Aluno alunos1_
on turma0_.id=alunos1_.turma_id
where
alunos1_.email=?
e
select
alunos0_.turma_id as turma_id4_0_0_,
alunos0_.id as id1_0_0_,
alunos0_.id as id1_0_1_,
alunos0_.email as email2_0_1_,
alunos0_.nome as nome3_0_1_,
alunos0_.turma_id as turma_id4_0_1_
from
Aluno alunos0_
where
alunos0_.turma_id=?
Resultando em:
[Turma [id=1, nome=Java, alunos=[Aluno [id=1, nome=Juquinha, email=juca@gmail.com], Aluno [id=2, nome=Mariazinha, email=mari@gmail.com]]]]
Ou seja… mesmo eu colocando o FetchType.EAGER no @OneToMany … o Hibernate ainda faz duas querys separadas… a primeira correta…mas a segunda não…pq pega o id da Turma e preenche o meu list com todos os alunos…
Não estou sabendo lidar com isso kkk Ja pesquisei …mas se alguem puder ajudar…agradeço!
