Hibernate Consulta com Lista de Objetos

7 respostas
C

Boa tarde!

Eu tenho uma classe Pessoa que possui uma lista de Grupos em um relacionamento ManyToMany, existe uma forma elegante de consultar por exemplo: retorna todas as Pessoas que possuem um determinado Grupo?

Estou tentando realizar uma consulta deste tipo, mas não consegui fazer de uma forma elegante utilizando Hibernate.

Já tentei desta forma:

Query query = manager.createQuery("select f from Pessoa as f where f.grupo in (:grupo)");
    query.setParameter("grupo", grupo);
    return query.getResultList();

Mas, apresenta esse erro: could not resolve property: grupo of: br.com.ludium.modelo.Pessoa

Obrigado!

7 Respostas

guivirtuoso

Como está a sua classe Pessoa?

C

Simplificada:

@Entity

@Table(name=PESSOA)

public class Pessoa {
public Pessoa() {
}

@Id
@GeneratedValue
@Column(name="id_funcionario")
private Long id;

@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(name = "PESSOA_GRUPOS", joinColumns = { @JoinColumn(name = "id_pessoa") }, inverseJoinColumns = {
        @JoinColumn(name = "id_grupo") })
private Collection<Grupo> listaDeGrupos = new ArrayList<>();

}

Obrigado pela atenção!

nei_santos

Já tentou o usar o INNER JOIN?

Ex:
select p from Pessoa p inner join p.listaDeGrupos grupo

guivirtuoso

Seu atributo de relacionamento é “listaDeGrupos” … e nao “grupo” como voce colocou em f.grupo

Faça como o @nei_santos sugeriu.

Abs

C

Muito obrigado pela ajuda!

Funcionou das duas maneiras:

Query query = manager.createQuery(“select p from Pessoa p inner join p.listaDeGrupos grupo where grupo in (:grupo)”);
query.setParameter(“grupo”, grupo);

Query query = manager.createQuery(“select p from Pessoa p where p.listaDeGrupos in (:grupo)”);
query.setParameter(“grupo”, grupo);

nei_santos

Legal @CaitanoDiniz =)

Soh uma dica: ao utilizar o inner join não eh necessário essa cláusula

"where grupo IN (:grupo)"; query.setParameter("grupo", grupo);

O inner join já vai trazer apenas pessoas que estejam associadas a uma lista de grupos.

Já a segunda query como não tem inner join precisa do where IN

Abs

C

Boa dica!

Mas eu estou retornando todas as pessoas que possuam um determinado grupo.

Algo como… um método que recebe um grupo e retorna todas as pessoas que possuem aquele grupo.

Um duvida que tenho é como o hibernate vai tratar esse inner join… hibernate irá unir completamente a tabela de Pessoa com a de Grupo e depois irá filtrar o Grupo?

Ou vai unir somente no caso de atender ao critério grupo?

Obrigado!

Criado 14 de janeiro de 2016
Ultima resposta 15 de jan. de 2016
Respostas 7
Participantes 3