Como resolver "java.sql.SQLException: Value '0000-00-00' can not be represented as java.sql.Date"?

5 respostas
V

Pessoal, bom dia!!

Estou desenvolvendo uma aplicação Web com Hibernate, JSF e JPA e estou tendo dificuldades para pegar um campo do tipo “Date” do MySQL.
Na minha aplicação, assim que a página abre, o sistema exibe um DataModel com todos os registros da tabela, no entanto, existe um campo do tipo “date” que, no MySQL tem como valor default “0000-00-00”… e o Java não reconhece esse data como um intervalo válido.

A minha dúvida não é O QUE fazer, mas sim, COMO fazer… ou seja, como fazer para obter e formatar a data que eu recebi como “0000-00-00” para um modo que o Java reconheça-a como um dado válido (por exemplo, NULL)…

Aqui está o meu método que faz essa consulta:

public DataModel getProCadastros(){
        EntityManager em = getEntityManager();
        if(isNsgSelected() == false && isNpSelected() == false && isClienteSelected() == false && isGerRespSelected() == false ){
            try{
                Query select = em.createQuery(" FROM ProCadastro as pCad ORDER BY nsg");            
                select.setMaxResults(getTamanhoArray()); // máximo de 20 registros
                select.setFirstResult(getPrimeiroRegistro());
                
                setModel(new ListDataModel(select.getResultList()));            
            } catch(Exception ex){
                ex.printStackTrace();
                addErrorMessage(ex.getLocalizedMessage());
            } finally{
                em.close();
            }
        } else {
            try{
                String SQL =    " FROM ProCadastro as pCad WHERE pCad.nsg LIKE :nsg";
                SQL +=          " AND pCad.np LIKE :np";
                SQL +=          " AND pCad.cliente LIKE :cliente";
                SQL +=          " AND pCad.gerResp LIKE :gerResp";                                
                
                Query select = em.createQuery(SQL);
                select.setParameter("nsg", busca +"%");
                select.setParameter("np", busca +"%");
                select.setParameter("cliente", busca +"%");
                select.setParameter("gerResp", busca +"%");
                
                select.setMaxResults(getTamanhoArray());
                select.setFirstResult(getPrimeiroRegistro());
                
                setModel(new ListDataModel(select.getResultList()));                  
            } catch(Exception ex){
                ex.printStackTrace(); 
            } finally{
                em.close();
            }
        }
        return getModel();
    }

Sei que dá pra usar o “SimpleDateFormat” ou algo do gênero, mas gostaria de saber como e onde usar…
Sei que é uma dúvida boba, mas começei a trabalhar com Java a menos de um mês e estou com essa dificuldade…

Atenciosamente,

5 Respostas

A

Caro colega,
Bom dia.

Se eu fosse você deixaria esse tratamento na camada do banco de dados conforme exemplo abaixo:

select (case when dataVencimento = '0000-00-00' then null else dataVencimento end) as dataVencimento from Alvara;

No lugar de null vc pode colocar o valor que você quiser desde que seja compatível do o tipo date e no mais fazer isso em java acho totalmente desnecessário.

Qualquer dúvida estamos ai…

André Santos.

R

tá muito confusa sua dúvida.

talvez, uma coisa que pode te ajudar é saber que, tanto para java quanto para bancos de dados (oracle, por exemplo), não existe data “0000-00-00”. nem “9999-99-99”, nem “2007-02-29” (se bem que alguns BDs interpretam esta última como 2007-03-01). Ou a data é valida, ou é nula (null).

M

Na URL de conexao com o banco basta acrescentar isso: zeroDateTimeBehavior=convertToNull.

Exemplo:

V

Fico muito agradecido pelas dicas oferecidas…

Quanto ao conceito de datas Ricardo, eu sei que tanto para Java, quanto para MySQL, quanto para Oracle não existe este tipo de formato para data. No entanto, já peguei o banco de dados montado e, pelo que analisei, com algumas falhas… e uma dessas falhas é essa…

mas fico muito agradecido pela dica…

E, André, obrigado pela dica quanto a forma de organizar as coisas…
analisando melhor, concordo com o conceito de deixar esse tratamento na camada do banco…

Obrigado

J

E no caso de se querer uma data 2008-00-00 ou 2008-02-00 ?
onde se quer somente armazenar o ano ou o ano/mês ?

no banco dá pra fazer, mas com objetos em java…
seria através da extensão das classes de data ??

atualmente eu transformei pra string mesmo, me poupei do trabalho!
Tento converter somente se não tiver yyyy-MM-00, yyyy-00-00 e 0000-00-00.
Se não converter ou não for uma das exceções eu não deixo salvar.

Criado 17 de março de 2008
Ultima resposta 3 de mai. de 2009
Respostas 5
Participantes 5