2010-02-26 5 views
11

J'ai une colonne de type Date dans Oracle DB et il contient la date et l'heure à coup sûr. Mais lorsque j'essaie d'obtenir des données dans une application java, la date sera renvoyée avec un tas de zéros au lieu du temps réel. Dans le code, il sera comme:Java Date Hibernate heure de coupure

SQLQuery sqlQuery = session.createSQLQuery("SELECT table.id, table.date FROM table"); 
List<Object[]> resultArray = sqlQuery.list(); 
Date date = (Date)resultArray[1]; 

Si elle était de 26 feb-2010 17:59:16 DB Je vais 26 feb-2010 00:00:00 Comment l'obtenir avec le temps?

Répondre

4

Je ne suis pas un expert avec Oracle, mais vous avez probablement besoin d'un type de colonne DateTime pour obtenir un horodatage.

Avec cela, vous devez utiliser java.sql.Timestamp type JDBC.

+3

Dans Oracle, le 'Date' contient à la fois type de données date et l'heure , un peu comme 'java.lang.Date'. –

0

Essayez ceci:

session.createSQLQuery("SELECT table.id as i, table.date as d FROM table") 
    .addScalar("i", Hibernate.LONG) // Or whatever type id is 
    .addScalar("d", Hibernate.TIMESTAMP); 
+0

Merci. Maintenant ça marche. Mais je déteste le fait que je devrais définir des types pour tous les paramètres retournés là. J'ai beaucoup d'entre eux ... – Vlad

+0

Vous pourriez essayer un dialecte personnalisé. Le dialecte de base dit "enregistrer les types d'hibernation pour une utilisation par défaut dans la détection automatique du type sqlquery scalaire" et a Types.DATE correspondant à Hibernate.DATE - vous pouvez le sous-classer et faire correspondre Types.DATE à Hibernate.TIMESTAMP. –

0

Peut-être que vous avez this problem? Assurez-vous que vous avez la dernière version du pilote JDBC, le nom du fichier doit être ojdbc5.jar.

3

J'ai rencontré le même problème (type Date Oracle dans la base de données).

Le mapping suivant fonctionne pour moi:

<property name="timeStamp" type="java.util.Date"> 
    <column name="TIME_STAMP"/> 
</property> 
2

Je l'ai rencontré ce problème dans le passé aussi. Pour le résoudre, changer votre carte de mise en veille prolongée de:

<property name="timeStamp" type="java.util.Date"> 
    <column name="TIME_STAMP"/> 
</property> 

à

<property name="timeStamp" type="timestamp"> 
    <column name="TIME_STAMP"/> 
</property> 

Vous pouvez laisser le type dans votre objet Mise en veille prolongée de données java.util.Date.

2

Oui, ce travail mise en veille prolongée aussi bien 3.3, utilisez ojdbc6.jar et annotation changer la date d'horodater comme ci-dessous

@Id 
@Temporal(TemporalType.TIMESTAMP) 
@Column(name = "TDATE", length = 7) 
public Date getTdate() { 
    return this.tdate; 
} 

public void setTdate(Date tdate) { 
    this.tdate = tdate; 
} 
9

Comme d'autres l'ont déjà dit, vous devez utiliser java.sql.Timestamp pour obtenir le temps. Cependant, si vous utilisez l'annotation @Temporal(TemporalType.TIMESTAMP) dans la colonne DATE d'Oracle, Hibernate se plaindra et enverra des erreurs de validation de schéma. Pour éviter ceux-ci, ajouter un columnDefinition comme ceci:

@Temporal(TemporalType.TIMESTAMP) 
@Column(name="EVENTTIME", columnDefinition="DATE") 
private Date eventTime; 
+2

Je ne peux pas assez en faire assez! Cela devrait être la réponse acceptée! –

0

j'étais dans le même problème récemment. Voici mon approche ...

Dans ce cas, définissez un pour la boucle dans la classe QueryImplementation, de manière à vérifier le type de toutes les colonnes de la table de base de données. Si le nom de la colonne est de type DATE, ajoutez addScalar ("columnName", new Timestamptype()) au générateur de requête. De cette façon, les colonnes de type Date afficheront le TimeStamp dans l'application Java.

S'il vous plaît trouver le code exemple ci-dessous:

SQLQuery hibernateQuery = getSession().createSQLQuery(sqlQuery); 

     Set<String> columns = columnDataTypes.keySet(); 
    for (String column : columns) { 
     if (columnDataTypes.get(column).equals(SqlType.DATE.name())) { 
      hibernateQuery.addScalar(column, new TimestampType()); 
     } else { 
      hibernateQuery.addScalar(column); 
     } 
    } 

Hope this helps.

Rakesh.

0

Peut-être un peu en retard, mais dans mon cas, la solution consistait simplement à ajouter @Temporal (TemporalType.DATE) à mon champ de date.

@Temporal(TemporalType.DATE) 
private Date date; 

Et une autre solution, nous avons trouvé (quand le premier ne fonctionne pas) était de dire explicitement mise en veille prolongée Type:

@Type(type = "date") 
private Date date;