Bonjour,
Est-ce qu'il est possible d'écrire une requêtte qui fait la jointure de plusieurs tables dans une entité bean?
Que dois-faire si c'est impossible?
Version imprimable
Bonjour,
Est-ce qu'il est possible d'écrire une requêtte qui fait la jointure de plusieurs tables dans une entité bean?
Que dois-faire si c'est impossible?
Bonjour,
Quelle version des EJB utilises-tu?
Valère
Comme j'ai la meme question.. avec les
EJB3?
Bonjour,
j'utilise EJB3 avec netbeans5.5 et sjsas9 comme serveur d'apllication.
Cordialement heriniaina1
Bonjour,
C'est tout à fait faisable, il suffit de passer par un objet wrapper qui encapsule les EJB des différentes tables à récupérer.
Par exemple, si NetBeans vous a créé les EJBs des tables TableA et TableB, alors vous pouvez créer un objet tel que le suivant:
Ensuite il faut l'utiliser dans une EJBQuery du genreCode:
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 package mypackage; public class MyWrapper { private TableA tableA; private TableB tableB; /** Creates a new instance of MyWrapper */ public MyWrapper() { } public TableA getTableA() { return tableA; } public void setTableA(TableA tableA) { this.tableA = tableA; } public TableB getTableB() { return tableB; } public void setTableB(TableB tableB) { this.tableB = tableB; } }
Et vous récupérez une liste de MyWrapper.Code:
1
2
3
4 String query = "SELECT new mypackage.MyWrapper(a, b) " + "FROM TableA a, TableB b " + "WHERE ${condition de jointure}" return emf.createEntityManager().createQuery(query)
Valère
Est ce qu'avec Jboss x'est la même chose?? J'utilise EclipseWTP avec un serveur JBOSS4..
C'est du JPA pur. Pour ma part, j'utilise ce type de code sans serveur applicatif, en J2SE, avec toplink. Je ne pense pas qu'utiliser l'implémentation d'hibernate de JPA pose problème.
Valère
Bonsoir,
j'ai essaié ce que valered a dit,je fait comme suit:
-entité beans(create entity from database ):entités Stage et Theme;
-Objet wrapper qui encapsule les EJB des différentes tables à récupérer(Stage et Theme)
Et pour l'ejbql dans une sessionbean:Code:
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 package com.entity; public class test { private Stage stage; private Theme theme; public test() { } public Stage getstage() { return stage; } public void setstage(Stage stage) { this.stage = stage; } public Theme gettheme() { return theme; } public void settheme(Theme theme) { this.theme = theme; } public test(Stage stage,Theme theme) { this.stage = stage; this.theme = theme; } }
j'ai essai avec :
mais netbeans ne connait pas createEntityManager() et je fait comme suit:Code:
1
2
3
4
5 String query = "SELECT new mypackage.MyWrapper(a, b) " + "FROM TableA a, TableB b " + "WHERE ${condition de jointure}" return emf.createEntityManager().createQuery(query)
Mais ce requête ne retourne rien,il y a erreur.Code:
1
2
3
4
5
6
7
8
9
10
11 public List lister() { String query = "SELECT new com.entity.test(a,b) " + "FROM Stage a, Theme b " + " WHERE and a.stgid=b.stgid "; Query squery =em.createQuery(query); List resultat = squery.getResultList(); return resultat; }
Que dois-je faire alors?
je vous remercie.
Cordialement heriniain_a1
Re,
Il faut que déclare un entity manager dans ta classe. Dans NetBeans, clic-droit | persistence | use entity manager et NB rajoutte tout ce qu'il faut dans ta classe.
Valère
Reponse,
voici la classe sessionbean avec l'entity manager
et je ne sait pas si dans cette classe de session que je dois rajouter tout ce qu'il faut dans ma classe dont vous avez parlé.Code:
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 package com.session; import java.util.List; import javax.ejb.Stateless; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.persistence.Query; @Stateless public class NewSessionBean implements NewSessionRemote, NewSessionLocal { @PersistenceContext private EntityManager em; public NewSessionBean() { } public void persist(Object object) { // TODO: // em.persist(object); } public List listerpourevaluation() { String query = "SELECT new com.entity.test(a,c) " + "FROM Stage a, Theme c " + " WHERE and c.stgid=a.stgid "; Query squery =em.createQuery(query); List resultata = squery.getResultList(); return resultata; } }
heriniain_a1
Tu peux effectivement utiliser celle là.
Valère
Bonsoir,
j'ai deja utilisé la session NewSessionBean et je cré une classe java(utilbean) dans la partie web pour appelé la session (NewSessionBean) ,je fait comme suit:
Et en fin dans la servlet, je fait comme suit :Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 partie de la classe utilbean .... public List donnerliste(){ try { Context c = new InitialContext(); Object o = c.lookup("java:comp/env/ejb/NewSessionBean "); NewSessionRemote NewSessionBean = (NewSessionRemote)PortableRemoteObject.narrow(o,NewSessionRemote.class); List liste = NewSessionBean.listerpourevaluation(); return liste; } catch(NamingException ne){ Logger.getLogger(getClass().getName()).log(Level.SEVERE,"exception caught" ,ne); throw new RuntimeException(ne); } } ......
Et quand je fait le deploiement,il y a erreur si je fait le déboguage c'est la partie listerpourevaluation() de la session bean qui fait des erreurs.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 partie de la servlet ........ protected void listessai(HttpServletRequest request,StageBean StageBean) throws ServletException, IOException { try { utilbean.donnerliste(); } catch (Exception e){ system.out.println("Erreur liste !"); } } .......
je ne sait pas donc si c'est ma code dans la servlet et classe utilbean qui ne fonctionne pas ou bien la requette dans la sessionbean?
Cordialement heriniain_a1