Requête SQL avec liaison multi-tables

Requête SQL avec liaison multi-tables - Java - Programmation

Marsh Posté le 18-12-2015 à 17:44:48    

Bonjour à toutes et à tous,
 
Je suis actuellement confronté à un problème avec mon projet java.
Le but de ce programme est de réaliser des requête SQL (côté JBOSS) et afficher le résultat dans une japplet côté client (GUI).
Venant du monde du php, l'adaptation n'est pas évidente, mais je ne me démoralise pas.
 
J'ai compris qu'il faut une class/table pour y récupérer les valeurs en base.
J'ai commencé par le SQL J2E qui n'est finalement pas du "SQL classique" (le "select *" par exemple ne fonctionne pas).
Voici le schéma relationnel de ma BDD (pour plus de facilité de compréhension).
http://img15.hostingpics.net/pics/11298917122015122942.png
 
J'ai donc commencé par une requête simple qui m'affiche une réservation, voici mes class côté serveur :
- VeloRemote.java qui est appelé par ma japplet

Code :
  1. package hw;
  2. import java.util.List;
  3. import javax.ejb.Remote;
  4. @Remote
  5. public interface VeloRemote {
  6. public List<Reservation> listerReservationClient();
  7. public List<Gare> listerGare();
  8. }


 
Qui appelle Velo.java

Code :
  1. package hw;
  2. import java.util.List;
  3. import javax.ejb.LocalBean;
  4. import javax.ejb.Stateless;
  5. import javax.persistence.EntityManager;
  6. import javax.persistence.PersistenceContext;
  7. @Stateless
  8. @LocalBean
  9. public class Velo implements VeloRemote {
  10. public Velo() {
  11. }
  12. @PersistenceContext
  13. EntityManager em;
  14. @Override
  15. public List listerReservationClient() {
  16.  return em.createNamedQuery("findReservation" ).getResultList();
  17. }
  18. @Override
  19. public List listerGare() {
  20.  return em.createNamedQuery("findGare" ).getResultList();
  21. }
  22. }


 
 
Puis pour l’exécution de la requête Reservation.java

Code :
  1. package hw;
  2. import java.io.Serializable;
  3. import javax.persistence.Entity;
  4. import javax.persistence.GeneratedValue;
  5. import javax.persistence.GenerationType;
  6. import javax.persistence.Id;
  7. import javax.persistence.NamedQueries;
  8. import javax.persistence.NamedQuery;
  9. @Entity
  10. @NamedQueries({ @NamedQuery(name = "findReservation", query = "SELECT r from Reservation R where idCompte=1" )})
  11. public class Reservation implements Serializable {
  12. private static final long serialVersionUID = 1L;
  13. @Id
  14. @GeneratedValue(strategy = GenerationType.AUTO)
  15. private String idVelo;
  16. private String le;
  17. public Reservation() {
  18. }
  19. public Reservation(String idVelo, String le) {
  20.  this.idVelo = idVelo;
  21.  this.le = le;
  22. }
  23. @Override
  24. public String toString() {
  25.   return "Vous avez une réservation depuis "+le;
  26. }
  27. }


 
Cela m'affiche bien dans mon application cliente le résultat (je fais un test s'il n'y a pas de réservation pour éviter une erreur de liste vide)
http://img15.hostingpics.net/pics/79087717122015123717.png
 
Comprenant le principe, j'ai commencé à écrire des requêtes plus compliquées, en l'occurrence avec des liaisons entre les tables.
J'ai vite découvert par des recherches google, qu'il était possible de faire des requêtes en SQL natif.
Voici Velo.java modifié:

Code :
  1. package hw;
  2. import java.util.List;
  3. import javax.ejb.LocalBean;
  4. import javax.ejb.Stateless;
  5. import javax.persistence.EntityManager;
  6. import javax.persistence.PersistenceContext;
  7. import javax.persistence.Query;
  8. import javax.xml.registry.infomodel.User;
  9. @Stateless
  10. @LocalBean
  11. public class Velo implements VeloRemote {
  12. public Velo() {
  13. }
  14. @PersistenceContext
  15. EntityManager em;
  16. @Override
  17. public List listerReservationClient() {
  18.  List<Reservation> list = em.createNativeQuery("SELECT idGare FROM reservation R, borne B where R.idBorne=B.id and idCompte=1", Reservation.class).getResultList();
  19.  System.out.println(list);
  20.  return null;
  21. }
  22. @Override
  23. public List listerGare() {
  24.  return em.createNamedQuery("findGare" ).getResultList();
  25. }
  26. }


 
et Reservation.java modifiée :

Code :
  1. package hw;
  2. import java.io.Serializable;
  3. import javax.persistence.Entity;
  4. import javax.persistence.GeneratedValue;
  5. import javax.persistence.GenerationType;
  6. import javax.persistence.Id;
  7. import javax.persistence.NamedQueries;
  8. import javax.persistence.NamedQuery;
  9. import javax.persistence.Table;
  10. @Table(name="reservation" )
  11. public class Reservation implements Serializable {
  12. private static final long serialVersionUID = 1L;
  13. @Id
  14. @GeneratedValue(strategy = GenerationType.AUTO)
  15. private String idVelo;
  16. private String le;
  17. private String idGare;
  18. private String idBorne;
  19. public Reservation() {
  20. }
  21. public Reservation(String idVelo, String le, String idGare,String idBorne) {
  22.  this.idVelo = idVelo;
  23.  this.le = le;
  24.  this.idGare = idGare;
  25.  this.idBorne = idBorne;
  26. }
  27. @Override
  28. public String toString() {
  29.   return "Vous avez une réservation depuis "+le+" "+idGare+" "+idBorne;
  30. }
  31. }


 
Je fais un simple affichage en console pour éviter d'avoir à gérer le retour de la liste côté client.
Malheureusement cela échoue, je comprends bien que la récupération de idGare  qui est dans la table borne n'est pas possible car je suis dans la class Reservation, mais comment lié la class Reservation et Borne du coup?
De plus, cette requête n'est qu'un test, car la requête finale est un peu plus complexe :

Code :
  1. select R.le, G.nom
  2. from reservation R, borne B, gare G
  3. where R.idBorne=B.id
  4. and G.id=B.idGare


Par l'intermédiaire de recherches Google et notamment grâce aux topic sur StackOverFlow, je pense avoir compris qu'il faut faire des liaisons dans chaque class, mais là je n'arrive pas à interpréter les réponses par rapport à ma situation.
Est-il possible d'avoir un coup de main pour comprendre comment réaliser ce genre de requête?
J'espère avoir été clair dans l'explication de mon problème.
 
D'avance Merci


Message édité par Profil supprimé le 18-12-2015 à 17:49:38
Reply

Marsh Posté le 18-12-2015 à 17:44:48   

Reply

Marsh Posté le 24-02-2016 à 08:27:36    

:hello:

 

tu peux pas ajouter un objet borne dans ton objet réservation, et indiquer que cet objet borne est donc représenté par une FK ?

 

Sinon pour la requête sql il serait mieux d'utiliser des join plutôt que des where  :jap:


Message édité par xCt le 24-02-2016 à 08:29:20
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed