Menu

Problème de requête avec JPA

Messages postés
70
Date d'inscription
samedi 17 juin 2017
Dernière intervention
27 janvier 2019
- - Dernière réponse : Streamooc
Messages postés
70
Date d'inscription
samedi 17 juin 2017
Dernière intervention
27 janvier 2019
- 4 janv. 2019 à 14:11
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

5 réponses

Messages postés
15954
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
18 mars 2019
3535
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
70
Date d'inscription
samedi 17 juin 2017
Dernière intervention
27 janvier 2019
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
15954
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
18 mars 2019
3535 -
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
70
Date d'inscription
samedi 17 juin 2017
Dernière intervention
27 janvier 2019
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
15954
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
18 mars 2019
3535 -
Ç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
70
Date d'inscription
samedi 17 juin 2017
Dernière intervention
27 janvier 2019
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
15954
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
18 mars 2019
3535 -
<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
Messages postés
70
Date d'inscription
samedi 17 juin 2017
Dernière intervention
27 janvier 2019
0
Merci
Bonjour KX.Merci pour la réponse.En procédant comme vous l'avez dit je remarque que seul le numéro de l'employé est affiché.Celà est dû au fait que la colonne NUMERO_GROUPE est NULL dans la table employe après l'ajout d'un employé à un groupe.Je ne sais pas si la méthode d'ajout a un problème.Veuillez la voir s'il vous plaît:
public void addEmployeToGroupe(Long codeEmpl, Long codeGr) {
try {
//Retrouvons l'employe par son code
Employe e=em.find(Employe.class, codeEmpl);
//Retrouvons le groupe par son code
Groupe g=em.find(Groupe.class, codeGr);
//Ajoutons un groupe à un employe
e.getGroupes().add(g);

//Ajoutons un employe à un groupe
g.getEmployes().add(e);

} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}


}
@Entity
@Table(name="GROUPE")
public class Groupe implements Serializable{
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="NUMERO_GROUPE")
private Long numeroGroupe;
private String nomGroupe;
//Un groupe contient plusieurs employ�s
@OneToMany(mappedBy="groupes")
private Collection<Employe> employes;
}

@Entity
@Table(name="EMPLOYE")
public class Employe implements Serializable{
/**
  • /

private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="CODE_EMPLOYE")
private Long codeEmploye;
private String nomEmploye;
private String sexeEmploye;
private String emailEmploye;
private String adresseEmploye;
private String contactEmploye;
private String roleEmploye;

@ManyToOne
@JoinColumn(name="CODE_EMPLOYE_SUP")
private Employe employeSup;


//Plusieurs employ�s pour un groupe
@ManyToMany(fetch=FetchType.EAGER)
@JoinTable(name="EMPLOYE_GROUPE",
joinColumns=@JoinColumn(name="CODE_EMPLOYE"),
inverseJoinColumns=@JoinColumn(name="NUMERO_GROUPE")

)

private Collection<Groupe> groupes;

}

<form role="form" action="<%=request.getContextPath()%>/registerEmployeToGroupe"
method="post">
<div class="box-body">


<div class="form-group">
<label for="exampleInputPassword1">Sélectionner l'employé</label>
<select
class="form-control" name="codeEmploye">
<c:forEach var="emp" items="${listeEmployes}">
<option value="${emp.codeEmploye}">${emp.codeEmploye }- ${emp.nomEmploye}</option>
</c:forEach>
</select>
</div>
<div class="form-group">
<label for="exampleInputPassword1">Sélectionner le groupe</label>
<select
class="form-control" name="numeroGroupe">
<c:forEach var="grp" items="${listeGroupes}">
<option value="${grp.numeroGroupe}">${grp.numeroGroupe}- ${grp.nomGroupe}</option>
</c:forEach>
</select>
</div>
</div>
<!-- /.box-body -->

<div class="box-footer">
<button type="submit" class="btn btn-primary">Valider</button>

</div>
</form>


@WebServlet(name="regempgrp",urlPatterns={"/registerEmployeToGroupe"})
public class RegisterEmployeToGroupeControleur extends HttpServlet{
@EJB
private IBanqueDaoLocal metierlocal;


}

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// Recuperation des parametres de la requete

String codeEmpl=request.getParameter("codeEmploye");
Employe e=new Employe(codeEmpl);
e.setCodeEmploye(Long.parseLong(codeEmpl));

String numeroGrp=request.getParameter("numeroGroupe");
Groupe g=new Groupe(numeroGrp);
g.setNumeroGroupe(Long.parseLong(codeEmpl));



// Insertion
metierlocal.addEmployeToGroupe(e.getCodeEmploye(), g.getNumeroGroupe());

RequestDispatcher rs = request.getRequestDispatcher("assets/gestionnaire/gestionEmployeGroupe/succesRegisterEmployeToGroupe.jsp");
rs.forward(request, response);
}

}
Commenter la réponse de Streamooc