Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2783 connectés 

  FORUM HardWare.fr
  Programmation
  Java

  Requête SQL avec liaison multi-tables

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Requête SQL avec liaison multi-tables

n°2271918
Profil sup​primé
Posté le 18-12-2015 à 17:44:48  answer
 

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
mood
Publicité
Posté le 18-12-2015 à 17:44:48  profilanswer
 

n°2276145
xCt
Posté le 24-02-2016 à 08:27:36  profilanswer
 

: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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

  Requête SQL avec liaison multi-tables

 

Sujets relatifs
[Résolu] Requete SQL[SQL] Select un nbre max de données = selectionner une ligne sur n.
[JQUERY]Problème requête ajax en GET via PHP[SQL] Requètes imbriquées ?
[projetCommun]c# multi bdd, datascienceRésultat d'une requête différent entre phpmyadmin et l'affichage
[SQL] Jointure pour villes dans régionAide pour finir - requete SQL avec search avec jointures
Plus de sujets relatifs à : Requête SQL avec liaison multi-tables


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR