Solucionado (ver solução)
Solucionado
(ver solução)
10
respostas

Não entendo este erro do enum

Estou com esta exceção no enum

Parameter value [I] did not match expected type [org.desif.enuns.ModuloEntregaDeclaracaoEnum (n/a)]

Estou entendendo que ele disse que o parametro I não existe no Enum ModuloEntregaDeclaracaoEnum

Mas minha classe enum e o I está la... Olhei no banco de dados e só existe o valor I no campo que referencia este enum.

package org.desif.enuns;

    public enum ModuloEntregaDeclaracaoEnum {

        D("Demonstrativo Contábil"), A("Apuração Mensal do ISSQN"), I("Informações Comuns aos Municípios");

        private String descricao;

        private ModuloEntregaDeclaracaoEnum(String descricao) {
            this.descricao = descricao;
        }

        public String getDescricao() {
            return descricao;
        }

        public void setDescricao(String descricao) {
            this.descricao = descricao;
        }

        @Override
        public String toString() {
            return descricao;
        }

    }

O que está de errado ?

10 respostas

Oi Guilherme, coloca aqui o modelo que está usando esse enum?

Segue.

@Column(name = "idf_declaracao")
@Enumerated(EnumType.STRING)
public ModuloEntregaDeclaracaoEnum getDeclaracao() {
    return declaracao;
}

public void setDeclaracao(ModuloEntregaDeclaracaoEnum declaracao) {
    this.declaracao = declaracao;
}

E alguma chance de ter um registro em seu banco com o campo idf_declaracao diferente de algum dos valores do seu enum?

Somente nulo o que pode ter mesmo.

Como este sistema estamos migrando ele de Maker para JAVA.

Esse problema está acontecendo quando vc faz uma query? Ou na hora de salvar no banco?

Posta aqui o código onde essa exception acontece?

Faço uma consulta

StringBuilder hqlSelectEntidade = new StringBuilder(
                "new IdentificacaoEntity(i.id, i.cnpj, i.nome, i.mesAnoInicio, ");
        hqlSelectEntidade.append("\n i.mesAnoFim, i.tipo, i.dataHora, i.protocolo, i.status) ");
        hqlSelectEntidade.append("\n FROM IdentificacaoEntity i ");
        hqlSelectEntidade.append("\n WHERE i.status NOT IN ('" + StatusIdentificacaoEnum.N.name() + "', '"
                + StatusIdentificacaoEnum.D.name() + "') ");
        hqlSelectEntidade.append("\n AND i.declaracao = :declaracao");
        final String queryEntidade = "SELECT " + hqlSelectEntidade;
        Query querySelectEntidade = em.createQuery(queryEntidade);
        querySelectEntidade.setParameter("declaracao", declaracao.name());
        Set<IdentificacaoEntity> resultSetEntidade = new HashSet(querySelectEntidade.getResultList());
        return new ArrayList(resultSetEntidade);

Novo enum

package org.desif.enuns;

public enum ModuloEntregaDeclaracaoEnum {

    DEMONSTRATIVO_CONTABIL("Demonstrativo Contábil"), APURACAO_MENSAL_ISSQN(
            "Apuração Mensal do ISSQN"), INFORMACOES_COMUNS_MUNICIPIOS("Informações Comuns aos Municípios"), NENHUM("");

    private String descricao;

    private ModuloEntregaDeclaracaoEnum(String descricao) {
        this.descricao = descricao;
    }

    public String getDescricao() {
        return descricao;
    }

    public void setDescricao(String descricao) {
        this.descricao = descricao;
    }

    @Override
    public String toString() {
        return descricao;
    }
}
solução!

acredito que o problema esteja nessa linha:

querySelectEntidade.setParameter("declaracao", declaracao.name());

aqui você não precisa fazer o declaracao.name() isso vai te retornar uma String, tenta fazer isso:

querySelectEntidade.setParameter("declaracao", declaracao);

assim ele vai settar o valor do enum mesmo em vez de uma String contendo o enum

Obrigado Philippe Ehlert

Realmente erro bobo.

Mudei a consulta e continuou funcionando, pois tinha enuns que estavam passando a string.

StringBuilder hqlSelectEntidade = new StringBuilder(
                "new IdentificacaoEntity(i.id, i.cnpj, i.nome, i.mesAnoInicio, ");
        hqlSelectEntidade.append("\n i.mesAnoFim, i.tipo, i.dataHora, i.protocolo, i.status) ");
        hqlSelectEntidade.append("\n FROM IdentificacaoEntity i ");
        hqlSelectEntidade.append("\n WHERE i.status <> :naoProcessada ");
        hqlSelectEntidade.append("\n AND i.status <> :desativada ");
        hqlSelectEntidade.append("\n AND i.declaracao = :declaracao ");
        final String queryEntidade = "SELECT " + hqlSelectEntidade;
        Query querySelectEntidade = em.createQuery(queryEntidade);
        querySelectEntidade.setParameter("declaracao", declaracao);
        querySelectEntidade.setParameter("naoProcessada", StatusIdentificacaoEnum.NAO_PROCESSADA);
        querySelectEntidade.setParameter("desativada", StatusIdentificacaoEnum.DESATIVADA);

Ótimo guilherme! Que bom que funcionou!

Abraços!