Comment stocker une date Java dans un datetime Mysql avec JPA

104

Quelqu'un peut-il me dire comment puis-je stocker une date Java dans un datetime Mysql ...

Lorsque j'essaie de le faire ... seule la date est stockée et l'heure reste 00:00:00 dans les magasins de dates Mysql comme celui-ci ...

2009-09-22 00:00:00

Je veux non seulement la date mais aussi l'heure ... comme

2009-09-22 08:08:11

J'utilise JPA (Hibernate) avec les classes spring mydomain utilise java.util.Date mais j'ai créé des tables à l'aide de requêtes manuscrites ...

c'est ma déclaration de création

CREATE TABLE ContactUs (id BIGINT auto_increment, 
                        userName VARCHAR(30), 
                        email VARCHAR(50), 
                        subject VARCHAR(100), 
                        message VARCHAR(1024), 
                        messageType VARCHAR(15), 
                        contactUsTime datetime, 
                        primary key(id))
                        TYPE=InnoDB;
Urvish
la source
des morceaux de votre code, peut-être?
Bozho
1
De nos jours, vous ne devriez plus utiliser java.util.Datedu tout (en 2010, il n'y avait probablement pas de meilleur choix). Mieux vaut utiliser les classes modernes, comme java.time.Instantou java.time.LocalDateTime, en fonction des exigences exactes de la date-heure que vous devez stocker.
Ole VV
Certaines de ces anciennes réponses figurent assez haut dans les classements Google. Dans Java 8+, nous pouvons simplement utiliser LocalDateTime pour enregistrer datetime au lieu de recourir à @Temporal pour enregistrer au format datetime
HopeKing
prepareStatement.setTimestamp (1, nouvel horodatage (System.currentTimeMillis ()));
Rajat

Réponses:

165

voir dans le lien:

http://www.coderanch.com/t/304851/JDBC/java/Java-date-MySQL-date-conversion

Le code suivant vient de résoudre le problème:

java.util.Date dt = new java.util.Date();

java.text.SimpleDateFormat sdf = 
     new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

String currentTime = sdf.format(dt);

Ce ' currentTime ' a été inséré dans la colonne dont le type était DateTime et il a réussi.

Haim Evgi
la source
4
mais, currentTime est un objet String, et dans db nous prenons datetime comme type de données, je pense qu'il ne va pas être inséré.
reddy
yyyy-MM-dd HH:mm:ssc'est tres important. Prenez note de la capitalisation.
biniam
91

Annotez votre champ (ou getter) avec @Temporal(TemporalType.TIMESTAMP), comme ceci:

public class MyEntity {
    ...
    @Temporal(TemporalType.TIMESTAMP)
    private java.util.Date myDate;
    ...
}

Cela devrait faire l'affaire.

Pascal Thivent
la source
2
C'est la réponse en effet!
Perneel le
2
pour cela, c'est la bonne réponse.
Ryan
3
sachez que si vous choisissez cette solution, votre date apparaîtra sous forme d'horodatage lorsqu'elle sera extraite de db. Il n'aura pas le bon formatage 'aaaa-MM-jj ....')
jon
37

Utilisez-vous peut-être java.sql.Date? Bien que cela ait une granularité de l'ordre de la milliseconde en tant que classe Java (il s'agit d'une sous-classe de java.util.Datemauvaise décision de conception), il sera interprété par le pilote JDBC comme une date sans composant d'heure. Vous devez utiliser à la java.sql.Timestampplace.

Michael Borgwardt
la source
1
Je n'utiliserais pas java.sql.Dateou java.sql.Timestampdans les classes de domaine mais je suppose que cela a été écrit avant la modification de l'OP.
Pascal Thivent
Je voudrais. Les objets java.util.Date ne se comparent pas aux objets java.sql.Timestamp avec des résultats entièrement prévisibles.
Doug Moscrop
8

Probablement parce que votre date java a un format différent de mysql format( YYYY-MM-DD HH:MM:SS)

fais ça

 DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
 Date date = new Date();
 System.out.println(dateFormat.format(date));
Marcx
la source
Vous avez mentionné le format correct dans la référence, puis vous avez utilisé le mauvais format dans le code.
Merric Huffstutler le
6

vous obtiendrez le 18/07/2011 + le format de l'heure

long timeNow = Calendar.getInstance().getTimeInMillis();
java.sql.Timestamp ts = new java.sql.Timestamp(timeNow);
...
preparedStatement.setTimestamp(TIME_COL_INDEX, ts);
Anuj
la source
5

mysql datetime -> GregorianCalendar

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = format.parse("2012-12-13 14:54:30"); // mysql datetime format
GregorianCalendar calendar = new GregorianCalendar();
calendar.setTime(date);
System.out.println(calendar.getTime());

GregorianCalendar -> mysql datetime

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String string = format.format(calendar.getTime());
System.out.println(string);
Nikopol
la source
4
java.util.Date date = new Date();
Object param = new java.sql.Timestamp(date.getTime());    
preparedStatement.setObject(param);
Michdraft
la source
1

Utilisez le code suivant pour insérer la date dans MySQL. Au lieu de changer le format de notre date pour répondre aux exigences de MySql, nous pouvons aider la base de données à reconnaître notre date en définissant les STR_TO_DATE(?, '%l:%i %p')paramètres.

Par exemple, 2014-03-12 peut être représenté comme STR_TO_DATE('2014-03-12', '%Y-%m-%d')

preparedStatement = connect.prepareStatement("INSERT INTO test.msft VALUES (default, STR_TO_DATE( ?, '%m/%d/%Y'), STR_TO_DATE(?, '%l:%i %p'),?,?,?,?,?)"); 
Yang_2333
la source
1

Ses conditions très simples dans cette réponse sont dans mysql, le type de données de la colonne est datetime et vous voulez envoyer des données du code java à mysql:

java.util.Date dt = nouveau java.util.Date ();
whatever your code object may be.setDateTime (dt);

la chose importante est juste de choisir la date et son format est déjà conforme au format mysql et de l'envoyer, aucune autre modification n'est requise.

Yash Agrawal
la source
0

En fait, vous ne pouvez pas utiliser SimpleDateFormat, vous pouvez utiliser quelque chose comme ça;

  @JsonSerialize(using=JsonDateSerializer.class)
  @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd/MM/yyyy HH:mm:ss")
  private Date blkDate;

De cette façon, vous pouvez obtenir directement la date avec le format spécifié.

Sahin Yanlık
la source
0

Je préfère toujours la méthode en une seule ligne

new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(Calendar.getInstance().getTime())
Mohannd
la source
-2

ça marche pour moi !!

dans la table mysql

DATETIME

dans l'entité:

private Date startDate;

en cours:

objectEntity.setStartDate(new Date());

dans la déclaration préparée:

pstm.setDate(9, new java.sql.Date(objEntity.getStartDate().getTime()));
Miguel Alonso Mosquera Aguilar
la source