5
respostas

Erro na inclusão de construtor na JPQL

A JPA não está aceitando essa sintaxe, apresentando os erros: 'No constructors can be found that match the argument types.' e 'The identification variable 'month' is not defined in the FROM clause.'

ao inserir o namedQuery @NamedQuery(name="mediaDiariaMovimentacoes", query="select new br.com.alura.jpa.modelo.MediaComData(avg(m.valor), day(m.data), month(m.data)) from Movimentacao m group by day(m.data), month(m.data), year(m.data)")

Não sei se está faltando alguma coisa pois não tem o video que explica essa parte.

5 respostas

Fala, Alexandre! Tudo bem contigo?

Desculpe a demora em dar um retorno!

Vou pedir para postar sua Classe Movimentacao e MovimentacaoDao para darmos uma olhada na estrutura ;-)

Ficaremos no aguardo!!!

Um abraço e até breve!

package br.com.alura.jpa.modelo;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQuery;

@NamedQuery(name="mediaDiariaMovimentacoes", 
query="select new br.com.alura.jpa.modelo.MediaComData(avg(m.valor), day(m.data), month(m.data)) "
        + "from Movimentacao m group by day(m.data), month(m.data), year(m.data)")
@Entity
public class Movimentacao {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long Id;
    @Enumerated(EnumType.STRING)
    private TipoMovimentacao tipoMovimentacao;
    private LocalDateTime data;
    private String descricao;
    private BigDecimal valor;
    @ManyToOne
    private Conta conta;

    @ManyToMany
    private List<Categoria> categorias;

    public Long getId() {
        return Id;
    }
    public void setId(Long id) {
        Id = id;
    }
    public TipoMovimentacao getTipoMovimentacao() {
        return tipoMovimentacao;
    }
    public void setTipoMovimentacao(TipoMovimentacao tipoMovimentacao) {
        this.tipoMovimentacao = tipoMovimentacao;
    }
    public LocalDateTime getData() {
        return data;
    }
    public void setData(LocalDateTime data) {
        this.data = data;
    }
    public String getDescricao() {
        return descricao;
    }
    public void setDescricao(String descricao) {
        this.descricao = descricao;
    }
    public BigDecimal getValor() {
        return valor;
    }
    public void setValor(BigDecimal valor) {
        this.valor = valor;
    }
    public Conta getConta() {
        return conta;
    }
    public void setConta(Conta conta) {
        this.conta = conta;
    }
    public List<Categoria> getCategorias() {
        return categorias;
    }
    public void setCategorias(List<Categoria> categorias) {
        this.categorias = categorias;
    }
}

public class MovimentacaoDao {
    private EntityManager em;
    public MovimentacaoDao(EntityManager em) {
        this.em = em;
    }

    public List<MediaComData> getMediaDiariaDasMovimentacoes() {
        String jpql = "select new br.com.alura.jpa.modelo.MediaComData(avg(m.valor), day(m.data), month(m.data)) "
                + "from Movimentacao m";
        TypedQuery<MediaComData> query = em.createNamedQuery("mediaDiariaMovimentacoes", MediaComData.class);
        return query.getResultList();
    }
}


public class MediaComData {
    private Double valor;
    private Integer dia;
    private Integer mes;

    public MediaComData(Double valor, Integer dia, Integer mes) {
        this.valor = valor;
        this.dia = dia;
        this.mes = mes;
    }

    public Double getValor() {
        return valor;
    }
    public Integer getDia() {
        return dia;
    }
    public Integer getMes() {
        return mes;
    }
}

Mesmo problema aqui.

Boa noite @Alexandre e @Flavio.

Na classe MovimentacaoDao experimente deixar o construtor de vocês assim:

public MovimentacaoDao(EntityManager em) {
        super();
        this.em = em;
}

@Alexandre uma outra alteração que você pode fazer é apagar a variável "jpql" com o select apenas para não fazer confusão já que nesse tópicos estamos usando namedquery:

select new br.com.alura.jpa.modelo.MediaComData(avg(m.valor), day(m.data), month(m.data)) from Movimentacao m

Boa noite. =)

Oi Vitor e Flavio,

a classe MediaComData precisa ter um construtor que recebe 3 parametros tipo double, Integer e Integer. Exemplo:

https://github.com/alura-cursos/1743-jpa-pesquisas/blob/master/src/main/java/br/com/alura/jpa/modelo/MediaComData.java

a bs

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