Menu

Problème de requête avec JPA

Messages postés
66
Date d'inscription
samedi 17 juin 2017
Dernière intervention
2 décembre 2018
- - Dernière réponse : KX
Messages postés
15859
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
12 décembre 2018
- 2 déc. 2018 à 12:53
Bonjour à tous.Je désire récupérer les employés par groupe de la table intermédiaire EMPLOYE_GROUPE mais je n'arrive pas.J'ai besoin d'aides s'il vous plaît.J'ai fais le mapping en se basant sur le fait qu'un employé peut appartenir à plusieurs groupes et q'un groupe contient plusieurs employés.

13:27:17,715 INFO [stdout] (default task-7) Probleme de requete
13:27:17,720 ERROR [stderr] (default task-7) java.lang.IllegalArgumentException: org.hibernate.QueryException: illegal attempt to dereference collection [employe0_.CODE_EMPLOYE.groupes] with element property reference [numeroGroupe] [SELECT e FROM jpa.domaine.Employe e WHERE e.groupes.numeroGroupe=:x]
13:27:17,725 ERROR [stderr] (default task-7) at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1679)
13:27:17,727 ERROR [stderr] (default task-7) at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1602)
13:27:17,728 ERROR [stderr] (default task-7) at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1608)
13:27:17,730 ERROR [stderr] (default task-7) at org.hibernate.jpa.spi.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:313)
13:27:17,731 ERROR [stderr] (default task-7) at jpa.dao.DaoImpl.employesParGroupe(DaoImpl.java:381)

public List<Employe> employesParGroupe(Long codeGroupe) {

List<Employe> employes=new ArrayList<Employe>();
try {

entityManagerFactory=Persistence.createEntityManagerFactory("jpa");
entityManager=entityManagerFactory.createEntityManager();

entityTransaction=entityManager.getTransaction();
entityTransaction.begin();

String jpql="SELECT e FROM Employe e WHERE e.groupes.numeroGroupe=:x";
TypedQuery<Employe> query=entityManager.createQuery(jpql,Employe.class);
query.setParameter("x", codeGroupe);
employes=query.getResultList();

entityTransaction.commit();

entityManager.close();
entityManagerFactory.close();
System.out.println("Liste des employes par groupe!!!");
} catch (Exception e) {
System.out.println("Probleme de requete");
e.printStackTrace();
}
return employes;
}

@Entity
@Table(name="EMPLOYE")
public class Employe implements Serializable{
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="CODE_EMPLOYE")
private Long codeEmploye;

@ManyToMany
@JoinTable(name="EMPLOYE_GROUPE",
joinColumns=@JoinColumn(name="CODE_EMPLOYE"),
inverseJoinColumns=@JoinColumn(name="NUMERO_GROUPE")

)
private Collection<Groupe> groupes;
}
@Entity
@Table(name="GROUPE")
public class Groupe implements Serializable{
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="NUMERO_GROUPE")
private Long numeroGroupe;
@OneToMany(mappedBy="groupes")
private Collection<Employe> employes;
}
Afficher la suite 

Votre réponse

4 réponses

Messages postés
15859
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
12 décembre 2018
0
Merci
Bonjour,

SELECT e FROM Employe e WHERE e.groupes.numeroGroupe=:x 

Si on traduit
e.groupes.numeroGroupe=:x
en Java, ça ferait :
Employe e = ...
Collection<Groupe> g = e.groupes;
Long n = g.numeroGroupe; // Erreur : g est une Collection, pas un Group !!

D'où ton exception : illegal attempt to dereference collection
Commenter la réponse de KX
Messages postés
66
Date d'inscription
samedi 17 juin 2017
Dernière intervention
2 décembre 2018
0
Merci
Merci beaucoup KX mais si j'utilise
//class Employe
@ManyToMany
@JoinTable(name="EMPLOYE_GROUPE",
joinColumns=@JoinColumn(name="CODE_EMPLOYE"),
inverseJoinColumns=@JoinColumn(name="NUMERO_GROUPE")

)
private Groupe groupe;


//class Groupe

@OneToMany(mappedBy="groupe")
private Collection<Employe> employes;

//DaoImpl

String jpql="SELECT e FROM Employe e WHERE e.groupe.numeroGroupe=:x";

j'aurai cette erreur:


Caused by: org.hibernate.AnnotationException: Illegal attempt to map a non collection as a @OneToMany, @ManyToMany or @CollectionOfElements: sn.objis.livrablejpa.domaine.Employe.groupe
at org.hibernate.cfg.annotations.CollectionBinder.getCollectionBinder(CollectionBinder.java:322)
at org.hibernate.cfg.AnnotationBinder.processElementAnnotations(AnnotationBinder.java:1864)
at org.hibernate.cfg.AnnotationBinder.processIdPropertiesIfNotAlready(AnnotationBinder.java:904)
at org.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.java:731)
at org.hibernate.boot.model.source.internal.annotations.AnnotationMetadataSourceProcessorImpl.processEntityHierarchies(AnnotationMetadataSourceProcessorImpl.java:245)
at org.hibernate.boot.model.process.spi.MetadataBuildingProcess$1.processEntityHierarchies(MetadataBuildingProcess.java:222)
at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:265)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:847)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:874)
at org.jboss.as.jpa.hibernate5.TwoPhaseBootstrapImpl.build(TwoPhaseBootstrapImpl.java:44)
at org.jboss.as.jpa.service.PersistenceUnitServiceImpl$1$1.run(PersistenceUnitServiceImpl.java:154)
... 7 more

Comment pourrais-je procéder?
KX
Messages postés
15859
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
12 décembre 2018
-
Tu pourrais faire cette requête :

SELECT e FROM Employe e, Group g WHERE g.numeroGroupe = :x AND g MEMBER OF e.groupes
Commenter la réponse de Streamooc
Messages postés
66
Date d'inscription
samedi 17 juin 2017
Dernière intervention
2 décembre 2018
0
Merci
Bonjour KX.Merci beaucoup.Je n'ai plus l'erreur mais au niveau du contrôleur j'ai cette erreur de NumberFormatException.J'ai essayé de la capturer en vain.Même si j'utilise le type int pour le numeroGroupe dans la table Groupe et que je parse avec parseInteger dans le contrôleur l'erreur demeure la même.Ou bien j'ai mal procédé dans la page jsp?
Caused by: java.lang.NumberFormatException: For input string: "numeroGroupe"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:580)
at java.lang.Integer.parseInt(Integer.java:615)
at javax.el.ListELResolver.toInteger(ListELResolver.java:409)
at javax.el.ListELResolver.getValue(ListELResolver.java:202)
at org.apache.jasper.el.JasperELResolver.getValue(JasperELResolver.java:110)
at com.sun.el.parser.AstValue.getValue(AstValue.java:139)
at com.sun.el.parser.AstValue.getValue(AstValue.java:203)
at com.sun.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:226)
at org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate(PageContextImpl.java:917)
at org.apache.jsp.assets.gestionnaire.employesParGroupe_jsp._jspx_meth_c_005fforEach_005f0(employesParGroupe_jsp.java:828)
at org.apache.jsp.assets.gestionnaire.employesParGroupe_jsp._jspService(employesParGroupe_jsp.java:616)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:433)
... 44 more


<div class="form-group">
                  <label for="exampleInputPassword1">Saisir le code du groupe</label>
                  <input type="number" class="form-control" name="codeGroupe"  id="exampleInputPassword1" placeholder="Code du groupe" required="required">
                </div>

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {


  String codeGr=request.getParameter("codeGroupe");
  try {
   Long cGr=Long.parseLong(codeGr);

   DaoImpl d=new DaoImpl();
   List<Employe> listeEmployes=new ArrayList<Employe>();
      listeEmployes=d.employesParGroupe(cGr);
     request.setAttribute("liste", listeEmployes);
   request.getRequestDispatcher("employesParGroupe.jsp").forward(request, response);
   
   
  } catch (NumberFormatException e) {
   System.out.println("n'est pas un nombre");
  }
  
 
 }

//Liste des employés avec leur groupe
              <table id="example2" class="table table-bordered table-hover">
                <thead>
                <tr>
                
                  <th>Groupe</th>
                  <th>Employe</th>
                                    
                </tr>
                </thead>
                    <tbody>
                              <c:forEach items="${requestScope.liste }" var="emp">
                   
                                           <tr>
                                                <td>${emp.groupes.numeroGroupe}</td>
                                           
                                            <td>${emp.codeEmploye}</td>

                                            </tr>
                               </c:forEach>
                                        </tbody> 
               <tfoot>
                                          <tr>
                                    
                  <th>Groupe</th>
                  <th>Employe</th>
                                    
                  
                </tr>
                                        </tfoot>
              </table>
            </div>
            <!-- /.box-body -->
          </div>

@Entity 
@Table(name="EMPLOYE") 
public class Employe implements Serializable{ 
@Id 
@GeneratedValue(strategy=GenerationType.IDENTITY) 
@Column(name="CODE_EMPLOYE") 
private Long codeEmploye; 

@ManyToMany 
@JoinTable(name="EMPLOYE_GROUPE", 
joinColumns=@JoinColumn(name="CODE_EMPLOYE"), 
inverseJoinColumns=@JoinColumn(name="NUMERO_GROUPE") 

) 
private Collection<Groupe> groupes; 
} 
@Entity 
@Table(name="GROUPE") 
public class Groupe implements Serializable{ 
@Id 
@GeneratedValue(strategy=GenerationType.IDENTITY) 
@Column(name="NUMERO_GROUPE") 
private Long numeroGroupe; 
@OneToMany(mappedBy="groupes") 
private Collection<Employe> employes; 
}
KX
Messages postés
15859
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
12 décembre 2018
-
Ça va être le même genre d'erreur que pour ma première réponse :

<td>${emp.groupes.numeroGroupe}</td>

emp.groupes est une Collection, pas un Groupe, donc numeroGroupe n'existe pas.
Commenter la réponse de Streamooc
Messages postés
66
Date d'inscription
samedi 17 juin 2017
Dernière intervention
2 décembre 2018
0
Merci
Merci beaucoup KX mais si je procède de la façon ci-dessous j'ai cette erreur.
<tr>

<th>Groupe</th>
<th>Employe</th>

</tr>
</thead>
<tbody>
<c:forEach items="${requestScope.liste }" var="emp">

<c:forEach items="${emp}" var="g">


<tr>
<td>${g.numeroGroupe}</td>
<td>${emp.codeEmploye}</td>

</tr>
</c:forEach>
</c:forEach>


</tbody>



Caused by: javax.servlet.jsp.JspTagException: Don't know how to iterate over supplied "items" in <forEach>
at org.apache.taglibs.standard.tag.common.core.ForEachSupport.toIterator(ForEachSupport.java:84)
at org.apache.taglibs.standard.tag.common.core.ForEachSupport.prepare(ForEachSupport.java:66)
at javax.servlet.jsp.jstl.core.LoopTagSupport.doStartTag(LoopTagSupport.java:241)
at org.apache.jsp.employesParGroupe_jsp._jspx_meth_c_005fforEach_005f1(employesParGroupe_jsp.java:866)

... 47 more

J'ai écris une méthode pour lister les groupes à laquelle je fais appel dans le contrôleur comme suit dans la page jsp. Sur mon navigateur la liste de tous les groupes s'affiche lorsque je saisis le numéro du groupe.Comment pourrais régler ça?Je ne veux pas afficher toute la liste des groupes,je veux uniquement afficher un groupe avec ses employés lorsque je saisis le code du groupe

public List<Groupe> listeGroupes(){
String jpql="SELECT g FROM Groupe g";
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {


String codeGr=request.getParameter("codeGroupe");
try {
Long cGr=Long.parseLong(codeGr);

DaoImpl d=new DaoImpl();
List<Employe> listeEmployes=new ArrayList<Employe>();
List<Groupe> listeGroupes=new ArrayList<Groupe>();
listeEmployes=service.employesParGroupe(cGr);
listeGroupes=d.listeGroupes();

request.setAttribute("liste", listeEmployes);
request.setAttribute("listeGr",listeGroupes);
request.getRequestDispatcher("employesParGroupe.jsp").forward(request, response);


} catch (NumberFormatException e) {
System.out.println("n'est pas un nombre");
}
}
<th>Groupe</th>
<th>Employe</th>

</tr>
</thead>
<tbody>
<c:forEach items="${requestScope.listeGr }" var="g">
<c:forEach items="${requestScope.liste}" var="emp">

<tr>
<td>${g.numeroGroupe}</td>

<td>${emp.codeEmploye}</td>


</tr>
</c:forEach>

</c:forEach>


</tbody>
KX
Messages postés
15859
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
12 décembre 2018
-
<c:forEach items="${requestScope.liste }" var="emp"> 
<c:forEach items="${emp}" var="g"> 

C'est toujours le même problème, pour t'en sortir il faut que tu comprennes de quel type sont chaque objet que tu manipule, ici ${emp} est un Employe, si tu veux itérer sur les groupes il faut utiliser ${emp.groupes} et seulement à ce moment là tu pourras faire ${g.numeroGroupe}

<c:forEach items="${requestScope.liste}" var="emp"> 
<c:forEach items="${emp.groupes}" var="g">
Commenter la réponse de Streamooc