IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JPA Java Discussion :

Problème de requête SELECT COUNT(*) avec table de jointure many-to-many


Sujet :

JPA Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2012
    Messages
    476
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2012
    Messages : 476
    Par défaut Problème de requête SELECT COUNT(*) avec table de jointure many-to-many
    Bonjour,

    Pour mon qcm, je veux calculer le nombre des bonnes réponses. J'avais repris un exemple sur le net avec l'annotation @Formula dans ma classe Entité mais ca ne marchait pas.
    J'ai alors voulu passé par une requête dans la couche métier, mais bien qu'elle fonctionne parfaitement sous mysql, j'ai une erreur (la table de jointure n'est pas mappée).
    Pourriez vous m'aider à trouver la solution ?

    Voici ma requête :
    "SELECT COUNT(*) FROM Evaluation_Reponse er, Reponse r WHERE er.evaluation_id = :evaluationId AND r.id = er.listOfReponses_id AND r.correct");

    où Evaluation et Reponse sont 2 entités liées en many-to-many. Le fait d'ajouter @JoinTable, de modifier la casse... n'a jamais rien changer.

  2. #2
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 713
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 713
    Par défaut
    Tu peux indiquer les structures de tables ?
    Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)

    Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/

  3. #3
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2012
    Messages
    476
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2012
    Messages : 476
    Par défaut
    Voila :
    classe Evaluation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    @Entity
    public class Evaluation implements Serializable {
     
        private static final long serialVersionUID = -1L;
     
    	private Long id;
    	private Date Date;
    	private int time ;
     
        private Qcm qcm;
        private List<Reponse> listOfReponses = new ArrayList<Reponse>();
     
        private Integer nbCorrectAnswers;
     
        @ManyToMany
        @JoinTable(name="Evaluation_Reponse") //je ne l'avais pas mis au début
        public List<Reponse> getListOfReponses() {
    	return listOfReponses;
        }
    Classe Reponse
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    @Entity
    public class Reponse implements Serializable{
     
    	private static final long serialVersionUID = 1L;
     
    		private Long id;
    		private String libelle;
    		private boolean correct;
    		private Question question;
    J'ai ajouté @JoinTable(name="Evaluation_Reponse") après coup, mais ca n'a rien changé, meme en ajoutant les @JoinColumns.
    Pour la classe Reponse, je n'ai pas mis de lien avec Evaluation car je n'ai pas besoin d'une table Reponse_Evaluation. Je l'ai fais pour vérifier, mais ca ne change rien.

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2012
    Messages
    476
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2012
    Messages : 476
    Par défaut
    oups, j'ai mal lu, ce sont les tables et non les classes que tu voulais.
    Je précise qu'avec jpa, elles sont créées automatiquement dans la base. Je les remplis ensuite si besoin est.

    donc dans la table evaluation, j'ai les colonnes
    - id
    - date
    - nbCorrectAnswers
    - time
    - qcm_id
    Elle est vide au départ et se remplit à chaque nouveau test.

    Dans la table reponse, j'ai
    - id
    - correct
    - libelle
    - question_id
    Après qu'elle ait été créée par jpa, je l'ai rempli manuellement

    et enfin, la table de jointure evaluation_reponse contient :
    - Evaluation_id
    - listOfReponse_id
    Tout comme la table evaluation, elle se remplit à chaque test

    je sais, c'est un peu du franglais, mais j'avais commencé en français et on m'a dit de tout mettre en anglais, donc avant de tout modifier, je préférerai que ca marche nickel.

  5. #5
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 713
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 713
    Par défaut
    Comment récupères-tu les données dans java avec la requête SQL ?
    Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)

    Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2012
    Messages
    476
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2012
    Messages : 476
    Par défaut
    j'ai pas tout bien compris la question, donc ma requête est incluse dans la méthode suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    @Override
    	public void saveCorrectAnswers(Evaluation evaluation) {
    		Query query = em.createQuery("SELECT COUNT(*) FROM evaluation_reponse er, Reponse r WHERE er.Evaluation_id = :evaluationId AND r.id = er.listOfReponses_id AND r.correct");
    		query.setParameter("evaluationId", evaluation.getId());
    		Long result=(Long) query.getSingleResult();
    		int nbCorrectAnswers = ((Long) result).intValue(); // convertit result en Integer
    		evaluation.setNbCorrectAnswers(nbCorrectAnswers);
    		evaluationRepository.save(evaluation);		
    	}
    J'appelle cette méthode après avoir enregistrer mon Evaluation, car sinon il recherche dans du vide. Cette méthode marche très bien puisque si j'utilise une requête toute simple du genre ("SELECT COUNT(*) FROM Evaluation e"), le nombre est bien chargé dans la base.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. select count avec 3 tables
    Par Riwalenn dans le forum Langage
    Réponses: 3
    Dernier message: 15/09/2010, 14h26
  2. [Requête SQL] - Select count avec plusieurs tables
    Par Pithonnette dans le forum SQL
    Réponses: 7
    Dernier message: 25/06/2009, 19h19
  3. Réponses: 1
    Dernier message: 22/12/2008, 10h15
  4. problème pour requête SELECT sur plusieurs tables
    Par 3dagard dans le forum Requêtes
    Réponses: 15
    Dernier message: 18/08/2008, 00h34
  5. Réponses: 21
    Dernier message: 03/08/2007, 12h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo