Preencher List filtrado com JPA

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!

Alguém ??? :sweat_smile:

Pessoal…resolvi…e coloco a solução q encontrei e pode ajudar alguem…

Onde estava:

Join<Turma, Aluno> aluno = from.join("alunos");    

Mudei para:

Fetch<Turma, Aluno> fetch = from.fetch("alunos");
Join<Turma, Aluno> aluno = (Join<Turma, Aluno>) fetch;

Dessa forma… Turma foi preenchida apenas com a lista de alunos filtrada