6
respostas

Joins encadeados JPA

A classe Produto eu tenho um atributo categoria mapeado com @OneToMany. Na classe Categoria eu tenho um atributo setor mapeado com @ManyToOne. Na classe Setor eu tenho um atributo cdSetor.

Eu preciso fazer dois join, sendo um de Produto para Categoria e um de Categoria para Setor.

Como eu faria para dar certo esse join e filtrar pelo atributo cdSetor? No código abaixo, o que precisaria ser feito para essa consulta funcionar?

Pode me ajudar por favor.

public List<Produto> getProdutos(String nome, Integer categoriaId,
        Integer lojaId) {

    CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder();
    CriteriaQuery<Produto> query = criteriaBuilder
            .createQuery(Produto.class);
    Root<Produto> root = query.from(Produto.class);

    Path<String> nomePath = root.<String> get("nome");
    Path<Integer> categoriaPath = root.join("categorias").<Integer> get("id");
    Path<Integer> lojaPath = root.<Loja> get("loja").<Integer> get("id");

    List<Predicate> predicates = new ArrayList<Predicate>();

    if (!nome.isEmpty()) {
        Predicate nomeIgual = criteriaBuilder.like(nomePath, "%" + nome + "%");
        predicates.add(nomeIgual);
    }

    if (categoriaId != null) {
        Predicate categoriaIgual = criteriaBuilder.equal(categoriaPath,
                categoriaId);
        predicates.add(categoriaIgual);
    }

    if (lojaId != null) {
        Predicate lojaIgual = criteriaBuilder.equal(lojaPath, lojaId);
        predicates.add(lojaIgual);
    }

    query.where((Predicate[]) predicates.toArray(new Predicate[0]));

    TypedQuery<Produto> typedQuery = em.createQuery(query);

    return typedQuery.getResultList();

}
6 respostas

Bom, no código com criteria eu fico meio perdido.. é tanta abstração que eu nem sei mais quem é quem... Faria com jpql e seria feliz...

String jpql = "select p from Produto p join p.categorias c  where c.setor.id = idDoSetor";

Depois concatenaria o resto da query e correria pro abraço.

O problema é quando temos um filtro e precisamos executar certas condições de acordo com o parâmetro recebido

É só fazer os ifs e adicionar na string da jpql....

Eu queria aprender a fazer esse join com criteria

        CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder();
        CriteriaQuery<Produto> query = criteriaBuilder
                .createQuery(Produto.class);
        Root<Produto> root = query.from(Produto.class);        
        Join<Object,Object> categoriasJoin = root.join("categorias");
        Join<Object, Object> cdSetorJoin = categorias.join("cdSetor");

E aí vc continua seu código.. pode continuar com criteria, mas no fim ela é bem mais complicada de entender do que uma jpql.

Como ficaria o select para trazer um SingleResult de uma tabela tb_usuario, onde carregaria uma lista de contatos, cardinalidade muitos para muitos, quando senha for tal e email for tal.

Grato.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software