Select 1:n and n:1 using JPQL

Asked

Viewed 38 times

0

Good night, I am trying to select between 1:n and n:1 tables using jpql

table categoira

@NotNull
@Column(nullable = false)
@OneToMany(mappedBy = "categoria")
private List<ProdutoCategoria> produtoCategorias;

Table of products

    @ManyToOne
    @JoinColumn(name = "idCategoria", nullable = false)
    private Categoria categoria;
    @ManyToOne
    @JoinColumn(name = "idProduto", nullable = false)
    private Produto produto;

product table

@NotBlank
@Column(nullable = false)
@OneToMany(mappedBy = "produto", cascade = CascadeType.ALL)
private List<ProdutoCategoria> categorias;

jpql

StringBuilder jpqlBuilder = new StringBuilder();
        jpqlBuilder.append("select new br.com.ecommerce.domain.dto.ProdutoDTO( ");
        jpqlBuilder.append("  cat.nome, ");
        jpqlBuilder.append("  count(pro) ");
        jpqlBuilder.append(") ");
        jpqlBuilder.append("from Produto pro ");
        jpqlBuilder.append("join pro.categorias.categoria cat  ");
        jpqlBuilder.append("group by cat.nome ");

with this query I hope to know how many products each category has ex: Category Hunted has 3 registered products

Constructor DTO

public ProdutoDTO(String categoria, Long quantidadeProdutos) {
        this.categoria = categoria;
        this.quantidadeProdutos = quantidadeProdutos;
    }

by trying the way this, gives that mistake

org.hibernate.Queryexception: illegal Attempt to dereference Collection [product0_.id.categorias] with element Property Reference [category]

1 answer

0


I took care of it, I wasted a lot of time on this"

StringBuilder jpqlBuilder = new StringBuilder();
jpqlBuilder.append("select new br.com.ecommerce.domain.dto.ProdutoDTO( ");
jpqlBuilder.append("  cat.categoria.nome, ");
jpqlBuilder.append("  count(pro) ");
jpqlBuilder.append(") ");
jpqlBuilder.append("from Produto pro ");
jpqlBuilder.append(" join pro.categorias cat  ");
jpqlBuilder.append("group by cat.categoria.nome ");

Browser other questions tagged

You are not signed in. Login or sign up in order to post.