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 :

Requetage impossible avec createQuery


Sujet :

Hibernate Java

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 45
    Par défaut Requetage impossible avec createQuery
    Bonjour,

    Lorsque je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    List lRequete = session.createQuery("select ID from ALERTES_TEMP").list();
    j'ai une exception qui est lancée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Nested Exception is org.hibernate.hql.ast.QuerySyntaxException: ALERTES_TEMP is not mapped [select ID from ALERTES_TEMP]
    	at org.hibernate.hql.ast.util.SessionFactoryHelper.requireClassPersister(SessionFactoryHelper.java:158)
    	at org.hibernate.hql.ast.tree.FromElementFactory.addFromElement(FromElementFactory.java:87)
    	at org.hibernate.hql.ast.tree.FromClause.addFromElement(FromClause.java:70)
    	at org.hibernate.hql.ast.HqlSqlWalker.createFromElement(HqlSqlWalker.java:255)
    	at org.hibernate.hql.antlr.HqlSqlBaseWalker.fromElement(HqlSqlBaseWalker.java:3056)
    	at org.hibernate.hql.antlr.HqlSqlBaseWalker.fromElementList(HqlSqlBaseWalker.java:2945)
    	at org.hibernate.hql.antlr.HqlSqlBaseWalker.fromClause(HqlSqlBaseWalker.java:688)
    	at org.hibernate.hql.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:544)
    	at org.hibernate.hql.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:281)
    	at org.hibernate.hql.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:229)
    	at org.hibernate.hql.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:228)
    	at org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:160)
    	at org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:111)
    Pourtant le mappage semble bon puisque je peux insérer des entrées dans ma table en faisant un begin, puis des set et enfin save puis commit.

    Si quelqu'un pouvait me dire vers quoi m'orienter pour résoudre cette exception.

    Merci

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 45
    Par défaut
    Ah oui,
    mes fichiers de mapping :

    hibernate.cfg.xml

    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
    33
    34
    35
    36
    37
    38
    39
    <?xml version='1.0' encoding='utf-8'?>
    <!DOCTYPE hibernate-configuration PUBLIC
            "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
            "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
     
    <hibernate-configuration>
     
        <session-factory>
     
            <!-- Database connection settings -->
            <property name="connection.driver_class">oracle.jdbc.xa.client.OracleXADataSource</property>
            <property name="connection.url">jdbc:oracle:thin:@**********</property>
            <property name="connection.username">*******</property>
            <property name="connection.password">********</property>
     
            <!-- JDBC connection pool (use the built-in) -->
            <property name="connection.pool_size">1</property>
     
            <!-- SQL dialect -->
            <property name="dialect">org.hibernate.dialect.OracleDialect</property>
     
            <!-- Enable Hibernate's automatic session context management -->
            <property name="current_session_context_class">thread</property>
     
            <!-- Disable the second-level cache  -->
            <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
     
            <!-- Echo all executed SQL to stdout -->
            <property name="show_sql">true</property>
     
            <!-- Drop and re-create the database schema on startup -->
            <property name="hbm2ddl.auto">create</property>
     
            <mapping resource="alertmail/AlertTableTemporaire.hbm.xml"/>
            <mapping resource="alertmail/AlertTablePrincipale.hbm.xml"/>
     
        </session-factory>
     
    </hibernate-configuration>
    et le fichier : AlertTableTemporaire.hbm.xml

    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
     
    <hibernate-mapping>
     
        <class name="alertmail.AlertTableTemporaire" table="ALERTES_TEMP">
    		 <id name="_id" type="integer">
    		 <column name="ID" sql-type="number"/>
    		 <generator class="increment" />
    		 </id>
     
    		 <property name="_email" type="string">
    		 <column name="EMAIL" sql-type="varchar(255)" not-null="true"/>
    		 </property>
     
    		 <property name="_newEmail" type="string">
    		 <column name="NEW_EMAIL" sql-type="varchar(255)" not-null="true"/>
    		 </property>  
     
    		 <property name="_alertPublication" type="string">
    		 <column name="PUBLICATIONS" sql-type="varchar(255)" not-null="true"/>
    		 </property>    
     
    		 <property name="_alertPressKits" type="string">
    		 <column name="PRESS_KITS" sql-type="varchar(255)" not-null="true"/>
    		 </property>    
     
    		 <property name="_alertPressRelease" type="string">
    		 <column name="PRESS_RELEASES" sql-type="varchar(255)" not-null="true"/>
    		 </property>    
     
    		 <property name="_alertAgenda" type="string">
    		 <column name="AGENDA" sql-type="varchar(255)" not-null="true"/>
    		 </property>    
     
    		 <property name="_format" type="string">
    		 <column name="FORMAT" sql-type="varchar(255)" not-null="true"/>
    		 </property>    
     
        </class>
     
    </hibernate-mapping>

  3. #3
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    Tu devrais faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    List lRequete = session.createQuery("from ALERTES_TEMP").list();
    (là, tu auras une liste d'objet alertmail.AlertTableTemporaire)

    ou alors tu passes par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    List lRequete = session.createSQLQuery("select ID from ALERTES_TEMP").list();
    A+
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 45
    Par défaut
    Ca fonctionne bien avec ta 2nde méthode.

    Par contre, si je fais la 1ere, j'ai toujours la même exception de lancée...

  5. #5
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    Effectivement, avec createQuery, il faut passer par le nom du POJO associé (AlertTableTemporaire il me semble), pas le nom physique de la table...


    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 45
    Par défaut
    Citation Envoyé par OButterlin
    Effectivement, avec createQuery, il faut passer par le nom du POJO associé (AlertTableTemporaire il me semble), pas le nom physique de la table...


    OK. Je vais tester.
    Par contre si j'ai besoin de mettre un WHERE, je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    createQuery ("from AlertTableTemporaire where MAIL like '%" + szMail + "'%")
    par exemple ?

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 45
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    List lRequete = session.createQuery("from ALERTES_TEMP").list();
    (là, tu auras une liste d'objet alertmail.AlertTableTemporaire)
    Si je fais sur les objets de ma liste un getClass (); ca renvoie Object....
    Je vois pas comment faire

  8. #8
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    Il faut faire un cast, tout simplement...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Iterator it = list.iterator();
    while ( it.hasNext() )
    {
       MonTypeObjet obj = (MonTypeObjet)it.next();
    }
    Sinon, pour faire un where, je te conseil l'objet Criteria plutôt, voici un exemple d'utilisation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Criteria query = getSession().createCriteria(Variable.class);    
     query.add(Expression.ilike("typNom", filtreType));
     query.addOrder( Order.asc("varMnemo1") );
     query.list();
    Si tu veux tout de même utiliser Query, il faut utiliser les propriétés du POJO pour les noms de colonnes, pas les noms physiques (à vérifier, moi j'utilise Criteria)...

    A+
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 45
    Par défaut
    Ca a l'air pas mal effectivement....

    Une dernière question stp...

    Je fais donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        Criteria query = session1.createCriteria(AlertTableTemporaire.class);    
    	query.add(Restrictions.like("_email", szMail));
    	query.list();
    Et quand j'affiche la longueur de ma list, il me mets 17.

    Or je vide ma table à chaque fois et donc y a qu'une seule entrée dans la table Alertes_temp. Je ne comprends donc pas ce résultat.

  10. #10
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    Tu fais quoi, list.size() ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 45
    Par défaut
    Citation Envoyé par OButterlin
    Tu fais quoi, list.size() ?
    oui je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        Criteria query = session1.createCriteria(AlertTableTemporaire.class);    
    	query.add(Restrictions.like("_email", szMail));
    	query.list();
    	System.out.println ("************** list.size () : " + query.list().size());
    et ca me rend :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [7/11/07 10:46:01:527 CEST] 77fe9017 SystemOut     O ************** list.size () : 17

  12. #12
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    Tu devrais déjà faire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ...
    List list = query.list();
    System.out.println( "Nombre d'éléments retournés : " + list.size() );
    ...
    parce que toi, tu exécutes 2x la requête... (je ne sais pas si ça le perturbe, à voir)

    Après, si ça ne fonctionne pas, il faudrait voir les enreg. dans la base de données, la valeur de szMail (avec ou sans %) etc... il sera difficile de t'aider sans...
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 45
    Par défaut
    Alors voila en gros le code.

    Je récupère une entrée de la table temporaire.
    Ensuite je l'efface de la table temporaire
    Puis j'efface ds la table principale si il y a deja une entrée du même nom
    Et j'insère la nouvelle entrée

    Tout ca est fait dans une portlet.
    Je peux pas appeler mon objet avec le nom session, car j'en ai deja un qui traine avec la portlet.

    Ensuite j'ai beau faire des close, flush, etc... ca change rien.

    C'est la premiere fois que j'utilise Hibernate... qui plus est dans une portlet.
    La BD c'est Oracle, le tout sous Websphere...

    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
     
    String szMail = sessionBean.getMail();
    	//TRANSACTION HIBERNATE!!!!	
        //ON RECUPERE DEPUIS LA BASE TEMPORAIRE
        Session session1 = HibernateUtil.getSessionFactory().openSession();
     
        session1.flush();
     
        Transaction tx = session1.beginTransaction();
     
    	Iterator i_contact = session1.createQuery("from AlertTableTemporaire where _email = :pid")
    				.setParameter("pid", szMail)
                    .list()
                    .iterator();
     
        Criteria query = session1.createCriteria(AlertTableTemporaire.class);    
    	query.add(Restrictions.like("_email", szMail));
    	List laListe = query.list();
     
    	System.out.println ("************** list.size () : " + laListe.size());
     
        AlertTableTemporaire contact = new AlertTableTemporaire ();
     
        while (i_contact.hasNext())
        {
    	    contact = (AlertTableTemporaire) i_contact.next();
        }
     
    	String szMailAAjouter    = contact.get_email();
    	String szNewMailAAjouter = contact.get_newEmail();
     
    	if (szNewMailAAjouter != null && szNewMailAAjouter.length() != 0)
    		szMailAAjouter = szNewMailAAjouter;
     
    	String szPublicationAAjouter  = contact.get_alertPublication();
    	String szPressKitAAjouter     = contact.get_alertPressKits();
    	String szPressReleaseAAjouter = contact.get_alertPressRelease();
    	String szAgendaAAjouter       = contact.get_alertAgenda();
    	String szFormatAAjouter       = contact.get_format();
     
    	//ON EFFACE LE CONTACT DE LA TABLE TEMPORAIRE
    	session1.delete(contact);
    	tx.commit();
     
     	//ON EFFACE LE CONTACT DE LA TABLE PRINCIPALE
     
    	Transaction tx2 = session1.beginTransaction(); 
    	Iterator i_requete2 = session1.createQuery("from AlertTablePrincipale where _email = :pid")
    				.setParameter("pid", szMail)
                    .list()
                    .iterator();
     
        while (i_requete2.hasNext())
        {
    	    AlertTablePrincipale contact2 = (AlertTablePrincipale) i_requete2.next();
    		session1.delete(contact2);	
        }
    	tx2.commit();
     
    	//ON RECREE LE NOUVEAU CONTACT 
     
    	Transaction tx3 = session1.beginTransaction(); 	   
    	AlertTablePrincipale contactFinal = new AlertTablePrincipale ();
    	contactFinal.set_email(szMailAAjouter);
    	contactFinal.set_alertPublication(szPublicationAAjouter);
    	contactFinal.set_alertPressKits(szPressKitAAjouter);
    	contactFinal.set_alertPressRelease(szPressReleaseAAjouter);
    	contactFinal.set_alertAgenda(szAgendaAAjouter);
    	contactFinal.set_format(szFormatAAjouter);
     
    	session1.save(contactFinal);
    	tx3.commit();
    	session1.close();

  14. #14
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    Donc, si je comprends bien, le nombre devrait augmenter dans le temps ?
    C'est peut-être que tes objets restent en session, tu devrais faire un session.evict(objet) après le session.delete(objet), tu peux toujours essayer...

    Tu devrais supprimer la boucle (je suppose un test) avec createQuery sur la table temporaire, tu fais la même avec Criteria...

    A part ça, pourquoi supprimer et recréer dans la table principale plutôt que de mettre à jour, il y a une raison ?

    A+
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  15. #15
    Membre averti
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 45
    Par défaut
    Citation Envoyé par OButterlin
    Donc, si je comprends bien, le nombre devrait augmenter dans le temps ?
    C'est peut-être que tes objets restent en session, tu devrais faire un session.evict(objet) après le session.delete(objet), tu peux toujours essayer...

    Tu devrais supprimer la boucle (je suppose un test) avec createQuery sur la table temporaire, tu fais la même avec Criteria...

    A part ça, pourquoi supprimer et recréer dans la table principale plutôt que de mettre à jour, il y a une raison ?

    A+
    Effectivement le nombre d'entrées dans les tables augmentent mais toujours une seule et unique entrée par mail.

    Merci pour le evict. Je vais tester.

    Pour la suppression de la table principale, je suis obligé car si l'entrée n'existe pas dans la table principale, il faut la créer.

Discussions similaires

  1. Réponses: 16
    Dernier message: 14/11/2019, 19h28
  2. [EJB] Remote call impossible avec WEBSPHERE
    Par nighma dans le forum Websphere
    Réponses: 1
    Dernier message: 19/06/2006, 16h18
  3. Réponses: 6
    Dernier message: 28/11/2005, 12h03
  4. [D2005]Compilation impossible avec version Personnal
    Par fab56 dans le forum Delphi .NET
    Réponses: 4
    Dernier message: 16/08/2005, 19h10
  5. [Requête] Difficile (impossible ?) avec des dates
    Par starch dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 06/04/2004, 11h26

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