Salvar campo Datetime do mysql

10 respostas
yurifw

eu estou usando o JXDatePicker do SwingX pra pegar uma data digitada pelo usuario, mas tem aparecido esse erro:

[EL Info]: 2012-07-19 08:41:42.903--ServerSession(18589815)--EclipseLink, version: Eclipse Persistence Services - 2.3.0.v20110604-r9504 [EL Info]: 2012-07-19 08:41:43.409--ServerSession(18589815)--file:/C:/Users/yurifw/Documents/NetBeansProjects/ThreeMasters2/build/classes/_ThreeMastersPU login successful [EL Warning]: 2012-07-19 08:41:43.488--ServerSession(18589815)--java.sql.SQLException: Value '0000-00-00' can not be represented as java.sql.Date [EL Warning]: 2012-07-19 08:41:43.489--UnitOfWork(33397988)--Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.3.0.v20110604-r9504): org.eclipse.persistence.exceptions.DatabaseException Exception in thread "AWT-EventQueue-0" Local Exception Stack: [color=red]Internal Exception: java.sql.SQLException: Value '0000-00-00' can not be represented as java.sql.Date[/color] Error Code: 0 Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.3.0.v20110604-r9504): org.eclipse.persistence.exceptions.DatabaseException Call: SELECT id, data_cadastro, data_fim, data_inicio, descricao, previsao_termino, titulo, projeto FROM tarefa Internal Exception: java.sql.SQLException: Value '0000-00-00' can not be represented as java.sql.Date Query: ReadAllQuery(name="Tarefa.findAll" referenceClass=Tarefa sql="SELECT id, data_cadastro, data_fim, data_inicio, descricao, previsao_termino, titulo, projeto FROM tarefa") Error Code: 0 Call: SELECT id, data_cadastro, data_fim, data_inicio, descricao, previsao_termino, titulo, projeto FROM tarefa Query: ReadAllQuery(name="Tarefa.findAll" referenceClass=Tarefa sql="SELECT id, data_cadastro, data_fim, data_inicio, descricao, previsao_termino, titulo, projeto FROM tarefa")

eu já mudei o campo do mysql pra DATE mas continua dando o mesmo erro, o meu código pra cadastrar ta aki:

Tarefa tarefa = new Tarefa();
        TarefaJpaController tarefaJPA = new TarefaJpaController(emf);
        
        ProjetoJpaController projetoJpa = new ProjetoJpaController(emf);
        Projeto projeto = (Projeto) projetoJpa.getEntityManager().createNamedQuery("Projeto.findById").
                setParameter("id",Integer.parseInt(txtProjetoId.getText())).getSingleResult();
        
        tarefa.setDataCadastro(new java.util.Date());
        tarefa.setDataFim(dataFim.getDate());
        tarefa.setDataInicio(dataInicio.getDate());
        tarefa.setDescricao(txtDescricao.getText());
        tarefa.setProjeto(projeto);
        tarefa.setTitulo(txtTitulo.getText());
        tarefa.setPrevisaoTermino(dataTermino.getDate());
        tarefaJPA.create(tarefa);
        
        //os campos que começam com data são JXDatePicker

os CRUD de outras classes (sem campo data) estão todos funcionando perfeitamente, mas nessa eu não consigo fazer nada

10 Respostas

nel

Interessante. Usando JPA e tendo como provider o EclipseLink.
Posta a entidade e dê um “System.out.println” no valor que tu captura da tela. Aparentemente, ele está pegando algo como ‘0000-00-00’.

yurifw

a saida foi essa:

Sat Jul 14 00:00:00 BRT 2012
Fri Jul 06 00:00:00 BRT 2012
Wed Jul 25 00:00:00 BRT 2012

minha entidade:

@Entity
@Table(name = "tarefa")
@XmlRootElement
@NamedQueries({
    @NamedQuery(name = "Tarefa.findAll", query = "SELECT t FROM Tarefa t"),
    @NamedQuery(name = "Tarefa.findById", query = "SELECT t FROM Tarefa t WHERE t.id = :id"),
    @NamedQuery(name = "Tarefa.findByDescricao", query = "SELECT t FROM Tarefa t WHERE t.descricao = :descricao"),
    @NamedQuery(name = "Tarefa.findByTitulo", query = "SELECT t FROM Tarefa t WHERE t.titulo = :titulo"),
    @NamedQuery(name = "Tarefa.findManyByTitulo", query = "SELECT t FROM Tarefa t WHERE t.titulo like :titulo order by t.titulo"),
    @NamedQuery(name = "Tarefa.findByDataCadastro", query = "SELECT t FROM Tarefa t WHERE t.dataCadastro = :dataCadastro"),
    @NamedQuery(name = "Tarefa.findByDataInicio", query = "SELECT t FROM Tarefa t WHERE t.dataInicio = :dataInicio"),
    @NamedQuery(name = "Tarefa.findByPrevisaoTermino", query = "SELECT t FROM Tarefa t WHERE t.previsaoTermino = :previsaoTermino"),
    @NamedQuery(name = "Tarefa.findByDataFim", query = "SELECT t FROM Tarefa t WHERE t.dataFim = :dataFim")})
public class Tarefa implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "id")
    private Integer id;
    @Column(name = "descricao")
    private String descricao;
    @Column(name = "titulo")
    private String titulo;
    @Column(name = "data_cadastro")
    @Temporal(TemporalType.DATE)
    private Date dataCadastro;
    @Column(name = "data_inicio")
    @Temporal(TemporalType.DATE)
    private Date dataInicio;
    @Column(name = "previsao_termino")
    @Temporal(TemporalType.DATE)
    private Date previsaoTermino;
    @Column(name = "data_fim")
    @Temporal(TemporalType.DATE)
    private Date dataFim;
    @JoinColumn(name = "projeto", referencedColumnName = "id")
    @ManyToOne
    private Projeto projeto;

    public Tarefa() {
    }

    public Tarefa(Integer id) {
        this.id = id;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getDescricao() {
        return descricao;
    }

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

    public String getTitulo() {
        return titulo;
    }

    public void setTitulo(String titulo) {
        this.titulo = titulo;
    }

    public Date getDataCadastro() {
        return dataCadastro;
    }

    public void setDataCadastro(Date dataCadastro) {
        this.dataCadastro = dataCadastro;
    }

    public Date getDataInicio() {
        return dataInicio;
    }

    public void setDataInicio(Date dataInicio) {
        this.dataInicio = dataInicio;
    }

    public Date getPrevisaoTermino() {
        return previsaoTermino;
    }

    public void setPrevisaoTermino(Date previsaoTermino) {
        this.previsaoTermino = previsaoTermino;
    }

    public Date getDataFim() {
        return dataFim;
    }

    public void setDataFim(Date dataFim) {
        this.dataFim = dataFim;
    }

    public Projeto getProjeto() {
        return projeto;
    }

    public void setProjeto(Projeto projeto) {
        this.projeto = projeto;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (id != null ? id.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Tarefa)) {
            return false;
        }
        Tarefa other = (Tarefa) object;
        if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "entity.Tarefa[ id=" + id + " ]";
    }
    
}
nel

Eu tenho algo assim:

@Temporal(TemporalType.TIMESTAMP) private Date creationDate;

Sendo que trata-se de um java.util.Date. Funciona normalmente.
Faça o mesmo teste e veja o resultado. Se ainda persistir o erro, esquece a API que use e passe um java.util.Date “fixo”, apenas a nível de teste mesmo.

asousaj

Caso as dicas do nel não funcionem , não seria o caso de usar:

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");   
String data = sdf.format(seuCamponente.getDate());

Deve ter jeito mais correto é claro.

yurifw

nenhum dos dois funcionou, e o pior é q da erro até na consulta, q n tem q inserir campo nenhum

asousaj

Mas quando da erro na consulta é o mesmo erro informado anteriormente?

Se a resposta for sim: Já pensou em remover do relacionamento com jpa o campo data? Só pra testar.

yurifw

é o mesmo erro, vou tentar tirar as datas aki

C

Para salvar o tipo Date no MySQL você deve fazer o seguinte:

ps.setDate(1, new java.sql.Date(new Date().getTime()));

É necessário salvar com o tipo sql.Date, e ele necessita de um Long. com o Date().getTime() vai funcionar!

yurifw

cembjr:
Para salvar o tipo Date no MySQL você deve fazer o seguinte:

ps.setDate(1, new java.sql.Date(new Date().getTime()));

É necessário salvar com o tipo sql.Date, e ele necessita de um Long. com o Date().getTime() vai funcionar!

de certinho \o/

ta qse td funcionando, to conseguindo fazer cadastro, exclusão e alteração, só a busca que continua dando erro, ela continua dando o mesmo erro:

Internal Exception: java.sql.SQLException: Value '0000-00-00 00:00:00' can not be represented as java.sql.Timestamp
Error Code: 0
Exception in thread "AWT-EventQueue-0" Local Exception Stack: 
Call: SELECT id, data_cadastro, data_fim, data_inicio, descricao, previsao_termino, titulo, projeto FROM tarefa
Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.3.0.v20110604-r9504): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: java.sql.SQLException: Value '0000-00-00 00:00:00' can not be represented as java.sql.Timestamp
Query: ReadAllQuery(name="Tarefa.findAll" referenceClass=Tarefa sql="SELECT id, data_cadastro, data_fim, data_inicio, descricao, previsao_termino, titulo, projeto FROM tarefa")
Error Code: 0
Call: SELECT id, data_cadastro, data_fim, data_inicio, descricao, previsao_termino, titulo, projeto FROM tarefa
Query: ReadAllQuery(name="Tarefa.findAll" referenceClass=Tarefa sql="SELECT id, data_cadastro, data_fim, data_inicio, descricao, previsao_termino, titulo, projeto FROM tarefa")
	at org.eclipse.persistence.exceptions.DatabaseException.sqlException(DatabaseException.java:324)

eu to a um tempão depurando isso ja e ainda n descobri o motivo
ta dando erro na named quer findAll a minha named query ta assim:

@NamedQuery(name = "Tarefa.findAll", query = "SELECT t FROM Tarefa t"),

o meu codigo pra fazer a busca ta assim:

TarefaJpaController JPATarefas = new TarefaJpaController(emf);
            List<Tarefa> tarefas;
            
            if (txtBusca.getText().equals("")) {
                tarefas = JPATarefas.getEntityManager().createNamedQuery("Tarefa.findAll").
                        getResultList();
            } else {
                tarefas = JPATarefas.getEntityManager().createNamedQuery("Tarefa.findManyByTitulo").
                        setParameter("titulo", txtBusca.getText()+"%").getResultList();
            }

obrigado pela força que voces estão dando

C

Desculpa mais ai já não posso te ajudar amigo … pra ser bem sincero nunca vi esse tipo de busca que você faz … foi mal!

Criado 19 de julho de 2012
Ultima resposta 20 de jul. de 2012
Respostas 10
Participantes 4