2009-09-01 8 views
28

la definizione del campoImpossibile convertire '0000-00-00 00:00:00' a TIMESTAMP

/** Date. */ 
    @Column(columnDefinition = "datetime") 
    private Date date; 

setter

public void setDate(final Date date) { 
    DateFormat dfmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
    try { 
     this.date = dfmt.parse(dfmt.format(date)); 
    } catch (ParseException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    } 

Qualcuno ha idea di come convertire "zero data" nella giusta valore? perché ho errore:

Cannot convert value '0000-00-00 00:00:00' from column 13 to TIMESTAMP 

E anche se ho impostato campo "default" e setter in questo modo:

/** Date. */ 
     @Column 
     private Date date; 


public void setDate(final Date date) { 
     this.date = date; 
    } 

io ancora lo stesso problema ....

+2

Mi sembra che 0000-00-00 00:00:00 non corrisponda a nessun momento effettivo nel tempo, e quindi fondamentalmente non può essere convertito in un valore di timestamp. Qual è il comportamento che volevi? Vuoi convertire la data ISO non valida in un valore predefinito? –

+0

la prossima mossa dopo aver ottenuto i dati (ci sono più di una sola colonna nella tabella) dalla tabella è scrivere questo in XML ma (!) Non scriverò il valore Data in XML quindi voglio solo ottenere i dati dalla tabella e dopodiché non chiamerò mai il metodo getDate(). – Oleksandr

+0

"Vuoi convertire la data ISO non valida in un valore predefinito?" - sì, se possibile ... – Oleksandr

risposta

63

Ho intenzione di fare una supposizione selvaggia qui che stai usando MySQL :-) Usa "zero date" come special placeholder - sfortunatamente, JDBC non può gestirli di default.

La soluzione è quella di specificare "zeroDateTimeBehavior = convertToNull" come parametro per la connessione a MySQL (sia in URL origine dati o come una proprietà aggiuntiva), ad esempio:

jdbc:mysql://localhost/myDatabase?zeroDateTimeBehavior=convertToNull 

In questo modo tutti questi valori da recuperare come NULL.

+1

+1. Aveva lo stesso problema. Ho trovato la stessa risposta. –

+0

Solo una nota a margine - questo convertirà zero date in null durante la lettura ma non convertirà null in zero durante il salvataggio. Non ho trovato un modo per salvare "0000-00-00" in un database attraverso l'ibernazione. – serg

+0

@ serg555 - hai ragione. Devo chiedere, però - perché vorresti mai salvare "0000-00-00" in un database? Esistono NULL proprio per questa ragione, questo intero abominio "0000-00-00" non è altro che dolore. – ChssPly76

3

Non capisco il punto nel tuo codice, in cui formatti quindi analizzi di nuovo una data. Questa sembra una operazione identica. Forse potresti elaborare?


Se si vuole dare un valore predefinito a una data, si potrebbe fare:

/** Jan 1, 1970 ; first moment in time in Java */ 
private static final Date NO_DATE = new Date(0L); 

private Date date; 

public void setDate(final Date date) { 
    if (date == null) { 
     this.date = NO_DATE; 
    } else { 
     this.date = date; 
    } 
} 

Nota: l'annotazione sono Optionnal, qui non ho aggiungerli.

In questo codice, è possibile sostituire ciò che si desidera alla condizione e al valore predefinito.

È anche possibile aggiungere un setter simile, che richiederebbe un argomento String e verificare il valore speciale "00000 ...". Ciò consentirebbe di impostare il campo con una data o con una stringa.

Problemi correlati