Print at Mar 10, 2010 4:59:47 AM

Posted by stephbibie at May 22, 2006 2:58:05 PM
JDODataStoreException when querring a collection in many to many relation
Hello,

I have 2 classes Critere and SousRubrique. Each class have a reference to the other. And I want to get all the Critere objects which have a specified SousRubrique.

Here is my pojos :

package modele.pojos;

import java.util.Set;

public class Critere {

private int id;
private String nom;
private Set<SousRubrique> sousRubriques;

.....

//all getters and setters

}

package modele.pojos;

import java.util.Set;

public class SousRubrique {

private int id;
private String nom;
private Rubrique rubrique;
private Set<Critere> criteres;

.....

//all getters and setters

}

and my metadata file :

<class name="SousRubrique" identity-type="application" table="sous_rubriques">
<field name="id" primary-key="true">
<column name="ID_SOUS_RUBRIQUE"/>
</field>
<field name="nom" >
<column precision="200"/>
</field>
<field name="rubrique">
<column name="ID_RUBRIQUE"/>
</field>
<field name="criteres" table="asso_sous_rubriques_criteres" default-fetch-group="true">
<collection element-type="Critere"/>
<join>
<column name="ID_SOUS_RUBRIQUE"/>
</join>
<element>
<column name="ID_CRITERE"/>
</element>
<extension vendor-name="jpox" key="cache-lazy-loading" value="false"/>
</field>
</class>

<class name="Critere" identity-type="application" table="criteres">
<field name="id" primary-key="true">
<column name="id_critere"/>
</field>
<field name="nom">
<column precision="100"/>
</field>
<field name="sousRubriques" persistence-modifier="persistent" mapped-by="criteres">
<collection element-type="SousRubrique"/>
</field>
</class>


So when I try to get the Critere objects by this way :

public List<Critere> getCriteresBySousRubrique(SousRubrique sr){
PersistenceManager pm = null;
Transaction tx = null;
Collection objects = null;
List<Critere> list = new ArrayList<Critere>();

try{
pm = PersistanceManageur.currentPM(false);
tx = pm.currentTransaction();
tx.begin();
Query q = pm.newQuery(Critere.class, "sousRubriques.contains(sr)");
objects = (Collection) q.execute();
Iterator iter = objects.iterator();
if (! iter.hasNext()){
System.out.println("Aucune classe trouvée");
}
else {
while (iter.hasNext()) {
list.add((Critere) iter.next());
}
}
tx.commit();

}
catch (Exception e){
e.printStackTrace();
}
finally{
if(tx.isActive())
tx.rollback();
PersistanceManageur.closePM();
}

return list;
}


I have this error :
javax.jdo.JDODataStoreException: Error executing JDOQL query "SELECT 'modele.pojos.Critere' AS JPOXMETADATA,THIS.ID_CRITERE,THIS.NOM,THIS.NON_AFFICHE FROM CRITERES THIS WHERE EXISTS (SELECT 1 FROM ASSO_SOUS_RUBRIQUES_CRITERES THIS_SOUSRUBRIQUES_SR,SOUS_RUBRIQUES UNBOUND_SR WHERE THIS_SOUSRUBRIQUES_SR.ID_CRITERE = THIS.ID_CRITERE AND THIS_SOUSRUBRIQUES_SR.ID_CRITERE = THIS.ID_CRITERE AND UNBOUND_SR.ID_SOUS_RUBRIQUE = THIS_SOUSRUBRIQUES_SR.ID_SOUS_RUBRIQUE)" : Erreur de syntaxe près de 'EXISTS (SELECT 1 FROM ASSO_SOUS_RUBRIQUES_CRITERES THIS_SOUSRUBR' à la ligne 1

I also tried like this :

Query q = pm.newQuery(Critere.class, "sousRubriques.contains(sr)");
q.declareParameters("SousRubrique sr");
objects = (Collection) q.execute(sr);

But I get the same error