IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Hibernate Java Discussion :

[Hibernate]test de date


Sujet :

Hibernate Java

  1. #1
    Membre habitué
    Inscrit en
    Octobre 2004
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 8
    Par défaut [Hibernate]test de date
    Bonjour,
    j'utilise l'objet Criteria d'Hibernate, quand je veux tester une date (util.java.date), il test sur tous l'emsemble YY/MM/DD HH:mm:ss nn. Cependant mon test fonctionnellement ne peut se faire que sur YY/MM/DD.

    Criteria criteria = connection.createCriteria(******.class)
    .add(Restrictions.eq("id.dtDebut",dtDebut))

    Avez vous une astuce pour eviter de tester sur l'heure, les minutes ... jusqu'au nanoseconde ??

    Merci de votre aide.

    Julien

  2. #2
    Membre émérite Avatar de zorm
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    584
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 584
    Par défaut
    Bonjour,

    Je te conseillerai d'utiliser les expressions regulieres (regex) dans ton cas, un petit exemple.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    import java.util.regex.*;
     
    public class test {
        public static void main(String[] args) throws Exception {
            // Create a pattern to match breaks
            Pattern p = Pattern.compile("[0-9]{2}:[0-9]{2}:[0-9]{2} [0-9]{2}");
            String date = "06/06/14 16:44:04 04";
            // Split input with the pattern
            String[] result = 
                     p.split(date);
            for (int i=0; i<result.length; i++)
                System.out.println(result[i]);
        }
    }
    dans ce cas, tu recuperes 06/06/14 sur ta console. ensuite rien ne t'empeche de sauvegarder le resultat dans une variable et de la traiter apres.

    Pour plus d'info sur les expressions regulieres, tu peux passer voir ce tuto la.
    http://cyberzoide.developpez.com/java/regex/regex.pdf

    J'espere d'avoir apporté des infos qui te seront utiles.

    cordialement,

    Zorm

  3. #3
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2002
    Messages : 652
    Par défaut
    essaye ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Criteria criteria = connection.createCriteria(******.class)
    .add(Restrictions.eq("id.dtDebut",new java.sql.Date(dtDebut.getTime())))
    java.sql.Date = Uniquement la date
    java.sql.Time = Uniquement l'heure
    java.sql.Timestamp = Date ET heure

  4. #4
    Membre habitué
    Inscrit en
    Octobre 2004
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 8
    Par défaut
    Ok merci à tous je vais tester tous ca !!!

  5. #5
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    238
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 238
    Par défaut
    Salut à tous.
    J'ai un problème avec la conversion des dates et je ne vois pas ce qui cloche.
    J'ai une chaine qui correspond à une date de la forme yyyy-MM-dd (21-06-2006)
    Et dans ma base, le format est le suivant : yyyy-MM-dd hh:mm:ss

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Date maDate = stringToDate(transformDate(date_deb_search),
    							"yyyy-MM-dd");
    transformDate renvoie la date sous le bon format (yyyy-MM-dd).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public static Date stringToDate(String sDate, String sFormat) {
    		try {
    			SimpleDateFormat sdf = new SimpleDateFormat(sFormat);
    			return sdf.parse(sDate);
    		} catch (ParseException e) {
    			e.printStackTrace();
    		}
    		return null;
    	}
    Et ensuite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    crit.add(Restrictions.eq("date_aff", new java.sql.Date(
    							maDate.getTime())));
    L'exception est levée par ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    List demandes = crit.list();
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    java.lang.ClassCastException: java.sql.Date
    	org.hibernate.type.StringType.toString(StringType.java:44)
    	org.hibernate.type.NullableType.nullSafeSet(NullableType.java:87)
    	org.hibernate.type.NullableType.nullSafeSet(NullableType.java:65)
    	org.hibernate.loader.Loader.bindPositionalParameters(Loader.java:1514)
    	org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1576)
    	org.hibernate.loader.Loader.doQuery(Loader.java:661)
    	org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:224)
    	org.hibernate.loader.Loader.doList(Loader.java:2145)
    	org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2029)
    	org.hibernate.loader.Loader.list(Loader.java:2024)
    	org.hibernate.loader.criteria.CriteriaLoader.list(CriteriaLoader.java:94)
    	org.hibernate.impl.SessionImpl.list(SessionImpl.java:1533)
    	org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:283)
    ...
    Pouvez-vous me guider vers la résolution de mon problème ?

  6. #6
    zev
    zev est déconnecté
    Membre expérimenté
    Inscrit en
    Octobre 2004
    Messages
    204
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 204
    Par défaut
    Je te conseillerai de réécrire ça en hdl query.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Date date = ... // ta date
    // Moi je met des calendar partout parce que ça marche bien
    Calendar cal = new GregorianCalendar();
    cal.setTimeInMillis(date.getTime());
     
    // La requete
    String requete = "from ... where .. and date = :ladate";
    // Execution et passage des parametres
    Query query = session.createQuery(requete).setCalendar("ladate",cal);

  7. #7
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    238
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 238
    Par défaut
    ok,
    mais dans le cas où j'aurai plusieurs dates à comparer, comment je m'y prends ?

    ....setCalendar("ladate",cal)..setCalendar("l'autreDate",cal); ???

  8. #8
    zev
    zev est déconnecté
    Membre expérimenté
    Inscrit en
    Octobre 2004
    Messages
    204
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 204
    Par défaut
    Oué, exactement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    String requete="from TableMachin tm where tm.date1 = :ladate1 and tm.date2 = :ladate2";
     
    Query q = session.createQuery(requete).setCalendar("ladate1",cal1).setCalendar("ladate2",cal2);
    Si tu veux pas utiliser les calendar il ya la methode setDate, mais les conversions entre java.sql.Date et java.util.Date c jamais clair; on sait jamais sur lequel on est, donc moi je préfère les calendar

  9. #9
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    238
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 238
    Par défaut
    En fait, pour l'instant ce que je fais c'est que (avant d'utiliser l'objet criteria d'hibernate) je créais la requête dynamiquement, et ensuite, je l'exécutais : du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    String requete="from TableMachin tm where tm.dateDebut > tm.dateFin ";
    Query q = session.createQuery(requete);
    Sauf que je ne sais pas qu'est-ce que je peux gagner au niveau performances...
    en gros vaut-il vraiment le coup de changer mes requetes, ou pas

  10. #10
    zev
    zev est déconnecté
    Membre expérimenté
    Inscrit en
    Octobre 2004
    Messages
    204
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 204
    Par défaut
    ben je pense pas que criteria soit plus rapide, j'ai meme entendu l'inverse.

  11. #11
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    238
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 238
    Par défaut
    Ok, je reste donc sur ma requête...
    (et moi qui pensait que c'était plus rapide avec les criteria...)
    heureusement que je n'ai pas tout changé...

    Merci !

  12. #12
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2002
    Messages : 652
    Par défaut
    requêtes statiques : HQL / SQL
    requêtes dynamiques : Criteria / Example

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 163
    Par défaut
    Alwin, c'est quoi ton dtdebut ?

  14. #14
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2002
    Messages : 652
    Par défaut
    Citation Envoyé par cicolas
    Alwin, c'est quoi ton dtdebut ?

    un simple objet java.util.Date :

  15. #15
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 163
    Par défaut
    Merci Alwin ! Mais j'ai un chti ClassCastException
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    s = sf.openSession();
    			// titre du livre dont la date est plus petite que la date actuelle !
    			Calendar dateToday = Calendar.getInstance();
    			Date date = (Date) new java.util.Date();
    			System.out.println(dateToday.toString());
    			Livres resL = (Livres) s.createCriteria(Livres.class)
    			.add(Restrictions.eq("date",new Date(date.getTime()))).uniqueResult();
    			String res = resL.getTitre();
    			System.out.println("Titre : "+res);
    Erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     java.lang.ClassCastException: java.sql.Date
    	at org.hibernate.type.CalendarType.toString(CalendarType.java:58) ....

  16. #16
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 163
    Par défaut
    Je mélangeai les Calendar et les Date, autant pour moi !
    Ca marche !!! ->
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    			Calendar dateToday = Calendar.getInstance();
    			System.out.println(dateToday.toString());
    			Livres resL = (Livres) s.createCriteria(Livres.class)
    			.add(Restrictions.not(Restrictions.eq("date",dateToday))).uniqueResult();
    			String res = resL.getTitre();
    			System.out.println("Titre : "+res);

  17. #17
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 163
    Par défaut [ Hibernate ] - Format de date dans une requête
    J'ai un problème ! je souhaiterai pouvoir définir le format de la date SQL de ma date qu'Hibernate va prendre pour comparer dans ma requête !
    En effet, il compare heure, minute, seconde, et donc C'est pas top !
    Une solution ? avec des criteria, ou du HQL ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Calendar dateToday = Calendar.getInstance();
    			dateToday.set(2006,6,22);
    			List resL = (List) s.createCriteria(Livres.class)
    			.add(Restrictions.not(Restrictions.eq("date",dateToday))).list();
    P.S. : Connaissez-vous les avantages des criteria ?

    Merci.

  18. #18
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2002
    Messages : 652
    Par défaut
    Bon, pour la dernière fois alors (vous n'écoutez pas trop je trouve en ce moment )

    Voici un exemple basique de gestion de DATE !!

    Pour commencer, 2 objet java.util.Date initialisés à la même date MAIS, l'une à 12h20, l'autre à 00h00.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Date dateReference = new GregorianCalendar(2004, Calendar.FEBRUARY, 16,12,20).getTime();
    Date dateRecherche = new GregorianCalendar(2004, Calendar.FEBRUARY, 16).getTime();
    J'ajoute un objet en base avec la date de référence :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Livre livre1 = new Livre("2-7440-1713-2");
    livre1.setTitre("UML 2.0");
    livre1.setDateParution(dateReference);
     
    ...
     
    session.save(livre1);
    Ensuite, je recherche les livres avec le 16/02/2004 comme DATE de parution sans me préocuper de l'heure !
    Le seule objet en java qui soit capable de ne contenir QUE la date est l'objet java.sql.Date !
    Je vais donc transformer ma date de recherche(util) en Date sql !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    java.sql.Date critereDate = new java.sql.Date(dateRecherche.getTime());
    List liste = session.createCriteria(Livre.class).add(Restrictions.eq("dateParution",critereDate)).list();
    Là, je récupère bien mon livre malgrès son heure !!!

    [2-7440-1713-2: UML 2.0 (Mon Feb 16 12:20:00 CET 2004).]
    Quand à la question Criteria ou HQL, j'y ai répondu il y as 2 posts de cela

Discussions similaires

  1. [VBA]test de date
    Par nejisama8 dans le forum VBA Access
    Réponses: 2
    Dernier message: 22/05/2007, 20h45
  2. [hibernate][test unitaire]j'arrive pas à inserer ce que je veux
    Par mehdi_swatch dans le forum Hibernate
    Réponses: 1
    Dernier message: 02/06/2006, 16h31
  3. [Dates] [php]Test de dates
    Par samjung dans le forum Langage
    Réponses: 4
    Dernier message: 26/04/2006, 17h00
  4. [hibernate] format de dates en HQL
    Par Bicky dans le forum Hibernate
    Réponses: 3
    Dernier message: 25/05/2005, 11h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo