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] Requete basé sur l'API Criteria


Sujet :

Hibernate Java

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    370
    Détails du profil
    Informations personnelles :
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Avril 2006
    Messages : 370
    Points : 223
    Points
    223
    Par défaut [Hibernate] Requete basé sur l'API Criteria
    Voila je seche depuis un moment sur la façon de créer ma requète avec Criteria :

    Je possède donc des User et j'aimerais pouvoir à l'aide d'une requète savoir si l'utilisateur que je créer n'existe pas deja en base de données.

    Je ne c'est pas coment m'y prendre et la doc ne m'est pas très claire :

    Puis-je demander directement la comparaison entre mon User et la base de données (j'ai bien le .equals de redéfini) ou faut t'il effectuer manuellement les contraintes (genre where truc = truc and machin = machin ...).
    La posix attitude ...

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

    Informations forums :
    Inscription : Mars 2006
    Messages : 163
    Points : 143
    Points
    143
    Par défaut
    Jdirai que tu peux faire un :

    session.createCriteria(User.class.getName()).add(Restrictions.eq("pseudo",getPseudo())).uniqueResult();

    qui te renverra le correspondant, mais bon ça revient au même qu'un where !

  3. #3
    Membre éclairé Avatar de BizuR
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    688
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 688
    Points : 757
    Points
    757
    Par défaut
    Citation Envoyé par K-Kaï
    Je possède donc des User et j'aimerais pouvoir à l'aide d'une requète savoir si l'utilisateur que je créer n'existe pas deja en base de données.
    Tu peux utiliser les "exemples" ... pour regarder si tu récupères un user avec les mm proprietes...

    Je pense que tu peux donc essayer un truc de ce style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    session.createCriteria(User.class).add(Example.create(myUser));
    Si le resultat est null c'est qu'il n'existe pas (myUser étant le user que tu veux insérer)

    Mais bon, ca reste un "en gros" la doc précise mieux comment se dépatouiller avec les exemples
    See you, space cowboy... and if you're satisfied, click on

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    370
    Détails du profil
    Informations personnelles :
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Avril 2006
    Messages : 370
    Points : 223
    Points
    223
    Par défaut
    Ouep merci pour les piste, c'est en gros ce que j'avais apercu, ainsi que le Expression.allEq(Map) mais je ne voyais pas comment lui spécifier d'ignorer la casse.

    Je vais farfouiller la doc plus en profondeur ...
    La posix attitude ...

  5. #5
    Membre éclairé Avatar de BizuR
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    688
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 688
    Points : 757
    Points
    757
    Par défaut
    Citation Envoyé par K-Kaï
    Ouep merci pour les piste, c'est en gros ce que j'avais apercu, ainsi que le Expression.allEq(Map) mais je ne voyais pas comment lui spécifier d'ignorer la casse.

    Je vais farfouiller la doc plus en profondeur ...
    Tu peux ajouter un .ignoreCase() à ton exemple pour satisfaire ton besoin
    See you, space cowboy... and if you're satisfied, click on

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    370
    Détails du profil
    Informations personnelles :
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Avril 2006
    Messages : 370
    Points : 223
    Points
    223
    Par défaut
    Justement avec le allEq pas de ignireCase possible, c'est pour cela que je voulais savoir si il n'y avait pas un moyen plus simple que de detaillé attribut par attribut avec les ignoreCase.

    Mais je regarde du coté des Exemple ...
    La posix attitude ...

  7. #7
    Membre éclairé Avatar de BizuR
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    688
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 688
    Points : 757
    Points
    757
    Par défaut
    Citation Envoyé par K-Kaï
    Mais je regarde du coté des Exemple ...
    C'est justement d'eux que je parlais ... mais c vrai qu'en oubliant la majuscules du E, ma phrase prêtait à confusion.
    See you, space cowboy... and if you're satisfied, click on

  8. #8
    Membre actif
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    370
    Détails du profil
    Informations personnelles :
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Avril 2006
    Messages : 370
    Points : 223
    Points
    223
    Par défaut
    Oue tinqiète pas j'avais pigé , la le soucis que je ne comprends pas c'est que je me prend une exception connection is closed dans ma fonction mais je capte pas pourquoi ...

    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
    16
     
    public boolean isUserinDB(User us) {
     
    		Session s = HibernateUtil.currentSession();
    		Criteria query = s.createCriteria(User.class);
    		query.add(Example.create(us).enableLike(MatchMode.EXACT).ignoreCase());
    		Transaction tx = s.beginTransaction();
    		List<User> result = (List<User>) query.list();
    		tx.commit();
    		HibernateUtil.closeSession();
     
    		if (result.size() > 0)
    			return true;
    		else 
    			return false;
    	}
    Et l'exception arrive sur le criteria.list(), mais pas moyen de savoir pourquoi ...
    La posix attitude ...

  9. #9
    Membre éclairé Avatar de BizuR
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    688
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 688
    Points : 757
    Points
    757
    Par défaut
    Essaie peut etre de faire démarrer la transaction au début de la création du Criteria... sinon, en effet, ca devrait marcher je pense aussi :/
    See you, space cowboy... and if you're satisfied, click on

  10. #10
    Membre actif
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    370
    Détails du profil
    Informations personnelles :
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Avril 2006
    Messages : 370
    Points : 223
    Points
    223
    Par défaut
    Alors la je ne comprend vraiment pas ce qui se passe voici l'exception généré en entier, j'ai d'autres methode qui reprenne le même principe et qui fonctionnes parfaitement :
    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    org.hibernate.SessionException: Session is closed!
    	at org.hibernate.impl.AbstractSessionImpl.errorIfClosed(AbstractSessionImpl.java:49)
    	at org.hibernate.impl.SessionImpl.getBatcher(SessionImpl.java:255)
    	at org.hibernate.loader.Loader.doQuery(Loader.java:714)
    	at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:224)
    	at org.hibernate.loader.Loader.doList(Loader.java:2145)
    	at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2029)
    	at org.hibernate.loader.Loader.list(Loader.java:2024)
    	at org.hibernate.loader.criteria.CriteriaLoader.list(CriteriaLoader.java:94)
    	at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1533)
    	at org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:283)
    	at persistance.HibernateManager.isUserinDB(HibernateManager.java:170)
    	at metier.GestionUser.creerUser(GestionUser.java:333)
    	at controleur.ServletPrinc.inscrireUser(ServletPrinc.java:102)
    	at controleur.ServletPrinc.doPost(ServletPrinc.java:66)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
    	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
    	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
    	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
    	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
    	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
    	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
    	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
    	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
    	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869)
    	at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664)
    	at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
    	at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
    	at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
    	at java.lang.Thread.run(Unknown Source)
    La posix attitude ...

  11. #11
    Membre actif
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    370
    Détails du profil
    Informations personnelles :
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Avril 2006
    Messages : 370
    Points : 223
    Points
    223
    Par défaut
    Bon en fait cette erreur n'est pas spécifique à cette methode, toute les methode ou j'utilisais HibernateUtil de la sorte me sorte la même erreur ...

    Je cherche, je cherche
    La posix attitude ...

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

    Informations forums :
    Inscription : Mars 2006
    Messages : 163
    Points : 143
    Points
    143
    Par défaut Avec Hibernate3...
    Avec Hibernate 3, tu peux facilment dpasser d'HibernateUtil !
    Jte file le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SessionFactory sf = new Configuration().configure().buildSessionFactory();
    			session = sf.openSession();
    ....
    //fermage de session courante
    session.close();
    Du coup, c'est plus pratique!
    J'utilise maintennat même Spring, et je soulage mon code des transactions et sessions, Spring gère ça !!

  13. #13
    Membre éclairé Avatar de BizuR
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    688
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 688
    Points : 757
    Points
    757
    Par défaut
    Citation Envoyé par cicolas
    Avec Hibernate 3, tu peux facilment dpasser d'HibernateUtil !
    Jte file le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SessionFactory sf = new Configuration().configure().buildSessionFactory();
    			session = sf.openSession();
    ....
    //fermage de session courante
    session.close();
    Du coup, c'est plus pratique!
    J'utilise maintennat même Spring, et je soulage mon code des transactions et sessions, Spring gère ça !!
    je vois pas trop ce qu'apporte ta solution en plus de celle d'HibernateUtil qui permet d'utiliser en threadLocal en plus ... non vraiment, je ne vois pas trop mais tu peux surement m'apporter la réponse
    See you, space cowboy... and if you're satisfied, click on

  14. #14
    Membre actif
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    370
    Détails du profil
    Informations personnelles :
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Avril 2006
    Messages : 370
    Points : 223
    Points
    223
    Par défaut
    Yep j'allais demander la même que BizuR, l'implementation ThreadLocal d'HibernateUtil est quand même bien pratique, surtout dans un univers J2EE
    La posix attitude ...

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

    Informations forums :
    Inscription : Mars 2006
    Messages : 163
    Points : 143
    Points
    143
    Par défaut
    C'est pas gentil Franck de casser mon collegue (devines qui c'est :p )

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

    Informations forums :
    Inscription : Mars 2006
    Messages : 163
    Points : 143
    Points
    143
    Par défaut
    Disons que ça mparait plus simple dme passer de cette classe qui fée pas grand chose qd mêm !!! J'ai lut que c'était facilment possible, donc, j'ai tester, et ça marche. Suffit d'instancier la facory une fois au début du programme, et dsen reservir après pour gérer les sessions.
    Jmet les liens sur lesquels j'ai trouvé ces infos :

    http://www.hibernate.org/42.html
    -> What about the SessionFactory?

    http://www.hibernate.org/hib_docs/v3...hitecture.html
    -> 2.5. Sessions Contextuelles

    Après, c'set à voir...

  17. #17
    Membre éclairé Avatar de BizuR
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    688
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 688
    Points : 757
    Points
    757
    Par défaut
    Citation Envoyé par cicolas
    C'est pas gentil Franck de casser mon collegue (devines qui c'est :p )
    pkoi _beber85 hacke le compte d'autres gens ?!? (c'est le seul "fion", pardonnez moi l'expression qui utilise mon prénom sur ce forum )

    Sinon, je ne casse pas, je présente uniquement mon point de vue sur l'utilisation d'HibernateUtil. Maintenant, je suis tout a fait conscient que cette utilisation n'est pas forcément applicable à tous les cas .... mais dans un developpement j2ee ... on peut espérer qu'il aura son utilité
    See you, space cowboy... and if you're satisfied, click on

Discussions similaires

  1. Formulaire basé sur requete Union
    Par capitaine dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 14/06/2006, 11h17
  2. Etat basé sur une Requete Analyse Croisée
    Par Bercud dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 08/06/2006, 16h03
  3. Réponses: 3
    Dernier message: 05/01/2006, 15h14
  4. SS Form basé sur une requete
    Par _developpeur_ dans le forum Access
    Réponses: 8
    Dernier message: 19/10/2005, 09h41
  5. Etat basé sur 2 requetes ?
    Par Betomy dans le forum Access
    Réponses: 1
    Dernier message: 20/09/2005, 14h24

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