Bonjour à tous,
Après de nombreuses recherches et aucun résultat, je me décide à vous faire part du problème que je rencontre actuellement sur Hibernate 3.
Je cherche à exécuter un update en HQL sur une table dont l'Id est composite.
Alors que j'arrive très bien à faire des updates sur des tables ou l'Id est simple, quand l'id est composite Oracle me remonte une erreur de syntaxe.
Je pense que la requête générée n'est donc pas correcte.
Malheureusement, je n'arrive pas à logger la requête qu'envoit hibernate pour m'en assurer.
J'ai simplifié mon code au maximum et voici ce que cela donne:
Tout d'abord la classe en question (sans les accesseurs pour réduire mon message):
La classe LotId qui correspond à l'Id composite:
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 public class Lot { private LotId id; private int etat; private String description; /** minimal constructor */ public Lot(LotId id) { this.setId(id); } {...} }
le mapping de la classe:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 public class LotId implements Serializable{ private int numeroLot; private int numeroTache; /** Creates a new instance of LotId */ public LotId() { super(); } {...} }
et enfin le code avec la requête HQL:
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 <hibernate-mapping> <class name="vi.domain.Lot"> <composite-id name="id" class="vi.domain.LotId"> <key-property name="numeroLot" type="int"> <column name="NUMERO_LOT" precision="10" scale="0" /> </key-property> <key-property name="numeroTache" type="int"> <column name="NUMERO_TACHE" precision="10" scale="0" /> </key-property> </composite-id> <property name="etat" type="int"> <column name="ETAT" /> </property> {..}
L'exception que je rencontre est la suivante:
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 public static int updateEtat(Lot lot){ String HqlQuery = "UPDATE Lot l SET l.etat = 0 WHERE l=:lot"; Session session = HibernateUtil.getSessionFactory().getCurrentSession(); session.beginTransaction(); Query query2 = session.createQuery(HqlQuery); query2.setEntity("lot",lot); int res = query2.executeUpdate(); session.getTransaction().commit(); if (session.isOpen()){ session.close(); } return res; }
Exception in thread "main" org.hibernate.exception.SQLGrammarException: could not execute update query.
...
Caused by: java.sql.SQLException: ORA-00920: Opérateur relationnel non valide
J'espère que l'un d'entre vous pourra m'aider car j'ai vraiment beaucoup cherché et ce problème est assez bloquant pour moi.
Merci d'avance!!
Eccoon
Partager