2009-09-01 6 views
28

la définition du champImpossible de convertir '0000-00-00 00:00:00' à 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(); 
    } 

    } 

Quelqu'un at-il idée de convertir "date zéro" en bonne valeur ? Parce que j'ai erreur:

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

Et même si je mets le terrain et setter "par défaut" comme ceci:

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


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

Je vais avoir toujours le même problème ....

+2

Il me semble que 0000-00-00 00:00:00 ne correspond à aucun moment réel, et par conséquent, il ne peut fondamentalement pas être converti en une valeur d'horodatage. Quel est le comportement que vous vouliez? Voulez-vous convertir la date ISO non valide en valeur par défaut? –

+0

le prochain mouvement après que j'obtienne des données (il y a plus d'une colonne dans la table) de la table est d'écrire ceci en XML mais (!) Je n'écrirai pas la valeur Date en XML ainsi je veux juste obtenir des données après, je n'appellerai jamais la méthode getDate(). – Oleksandr

+0

"Voulez-vous convertir la date ISO invalide en valeur par défaut?" - oui, si c'est possible ... – Oleksandr

Répondre

63

Je vais faire une supposition sauvage ici que vous utilisez MySQL :-) Il utilise "zéro date" comme special placeholder - Malheureusement, JDBC ne peut pas les gérer par défaut.

La solution est de préciser « zeroDateTimeBehavior = convertToNull » en tant que paramètre à votre connexion MySQL (soit dans l'URL de la source de données ou comme une propriété supplémentaire), par exemple:

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

Cela entraînera toutes ces valeurs à être récupérées comme NULLs.

+1

+1. Avait le même problème. Trouvé la même réponse. –

+0

Juste une note de côté - cela va convertir les dates zéro en valeurs nulles pendant la lecture, mais il ne convertira pas les valeurs nulles en zéros lors de la sauvegarde. Je n'ai pas trouvé un moyen de sauvegarder "0000-00-00" dans une base de données via Hibernate. – serg

+0

@ serg555 - vous avez raison. Je dois demander, cependant - pourquoi voudriez-vous jamais enregistrer "0000-00-00" dans une base de données? Les NULL existent précisément pour cette raison, toute cette abomination «0000-00-00» n'est que douleur. – ChssPly76

3

Je ne comprends pas le point dans votre code, où vous formatez ensuite parser une date. Cela semble être une opération identique. Peut-être pourriez-vous élaborer?


Si vous voulez donner une valeur par défaut à une date, vous pouvez faire:

/** 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; 
    } 
} 

Note: l'annotation sont optionnel, ici, je ne les ai pas ajouter.

Dans ce code, vous pouvez substituer ce que vous voulez à la condition, et à la valeur par défaut.

Vous pouvez également ajouter un setter similaire, qui prendra un argument String, et vérifier votre valeur spéciale "00000 ...". Cela permettrait de définir le champ soit avec une date, soit avec une chaîne.

Questions connexes