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).
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 :
- package hw;
- import java.util.List;
- import javax.ejb.Remote;
- @Remote
- public interface VeloRemote {
- public List<Reservation> listerReservationClient();
- public List<Gare> listerGare();
- }
|
Qui appelle Velo.java
Code :
- package hw;
- import java.util.List;
- import javax.ejb.LocalBean;
- import javax.ejb.Stateless;
- import javax.persistence.EntityManager;
- import javax.persistence.PersistenceContext;
- @Stateless
- @LocalBean
- public class Velo implements VeloRemote {
- public Velo() {
- }
- @PersistenceContext
- EntityManager em;
- @Override
- public List listerReservationClient() {
- return em.createNamedQuery("findReservation" ).getResultList();
- }
- @Override
- public List listerGare() {
- return em.createNamedQuery("findGare" ).getResultList();
- }
- }
|
Puis pour l’exécution de la requête Reservation.java
Code :
- package hw;
- import java.io.Serializable;
- import javax.persistence.Entity;
- import javax.persistence.GeneratedValue;
- import javax.persistence.GenerationType;
- import javax.persistence.Id;
- import javax.persistence.NamedQueries;
- import javax.persistence.NamedQuery;
- @Entity
- @NamedQueries({ @NamedQuery(name = "findReservation", query = "SELECT r from Reservation R where idCompte=1" )})
- public class Reservation implements Serializable {
- private static final long serialVersionUID = 1L;
- @Id
- @GeneratedValue(strategy = GenerationType.AUTO)
- private String idVelo;
- private String le;
- public Reservation() {
- }
- public Reservation(String idVelo, String le) {
- this.idVelo = idVelo;
- this.le = le;
- }
- @Override
- public String toString() {
- return "Vous avez une réservation depuis "+le;
- }
- }
|
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)
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 :
- package hw;
- import java.util.List;
- import javax.ejb.LocalBean;
- import javax.ejb.Stateless;
- import javax.persistence.EntityManager;
- import javax.persistence.PersistenceContext;
- import javax.persistence.Query;
- import javax.xml.registry.infomodel.User;
- @Stateless
- @LocalBean
- public class Velo implements VeloRemote {
- public Velo() {
- }
- @PersistenceContext
- EntityManager em;
- @Override
- public List listerReservationClient() {
- List<Reservation> list = em.createNativeQuery("SELECT idGare FROM reservation R, borne B where R.idBorne=B.id and idCompte=1", Reservation.class).getResultList();
- System.out.println(list);
- return null;
- }
- @Override
- public List listerGare() {
- return em.createNamedQuery("findGare" ).getResultList();
- }
- }
|
et Reservation.java modifiée :
Code :
- package hw;
- import java.io.Serializable;
- import javax.persistence.Entity;
- import javax.persistence.GeneratedValue;
- import javax.persistence.GenerationType;
- import javax.persistence.Id;
- import javax.persistence.NamedQueries;
- import javax.persistence.NamedQuery;
- import javax.persistence.Table;
- @Table(name="reservation" )
- public class Reservation implements Serializable {
- private static final long serialVersionUID = 1L;
- @Id
- @GeneratedValue(strategy = GenerationType.AUTO)
- private String idVelo;
- private String le;
- private String idGare;
- private String idBorne;
- public Reservation() {
- }
- public Reservation(String idVelo, String le, String idGare,String idBorne) {
- this.idVelo = idVelo;
- this.le = le;
- this.idGare = idGare;
- this.idBorne = idBorne;
- }
- @Override
- public String toString() {
- return "Vous avez une réservation depuis "+le+" "+idGare+" "+idBorne;
- }
- }
|
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 :
- select R.le, G.nom
- from reservation R, borne B, gare G
- where R.idBorne=B.id
- 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