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;

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.


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.


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.


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));

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);

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);

4
java.util.Date date = new Date();
Object param = new java.sql.Timestamp(date.getTime());    
preparedStatement.setObject(param);

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'),?,?,?,?,?)"); 

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.


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é.


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())

-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()));
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.