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 :

Requête JPQL dans une méthode Java


Sujet :

JPA Java

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2016
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2016
    Messages : 65
    Points : 36
    Points
    36
    Par défaut Requête JPQL dans une méthode Java
    Bonjour,
    j'ai implémenté une méthode qui me permet de générer un test (qui est un ensemble de question) de manière automatique sauf que avec le paramètre nombre de question à générer je dois spécifier aussi la catégorie des questions (j'ai une entité catégorie et donc une table catégorie) je sais pas comment ajouter la catégorie à la requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public List<Question> prepareRandomTest(int number_of_questions, Categorie categorie){ 
    		  String jpql = "SELECT q FROM Question q ORDER BY RANDOM() LIMIT "+number_of_questions  ;
    		 Query query = entityManager.createQuery(jpql);
    		 entityManager.persist(Question.class);
    		  return query.getResultList();
    		}

  2. #2
    Membre chevronné
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 348
    Points : 1 787
    Points
    1 787
    Par défaut
    Salut,

    Il faudrait que tu nous donnes la classe Question et la classe Categorie pour qu'on puisse t'aider

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2016
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2016
    Messages : 65
    Points : 36
    Points
    36
    Par défaut
    Citation Envoyé par chtig Voir le message
    Salut,

    Il faudrait que tu nous donnes la classe Question et la classe Categorie pour qu'on puisse t'aider
    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    package tn.esen.entities;
     
    import java.io.Serializable;
    import java.util.Collection;
     
    import javax.persistence.CascadeType;
    import javax.persistence.Entity;
    import javax.persistence.FetchType;
    import javax.persistence.GeneratedValue;
    import javax.persistence.GenerationType;
    import javax.persistence.Id;
    import javax.persistence.OneToMany;
    @Entity
    public class Categorie implements Serializable {
    	/**
             * 
             */
    	private static final long serialVersionUID = 1L;
    	@Id
    	@GeneratedValue(strategy=GenerationType.IDENTITY)
    	private int id;
    	    private String type;
    	    @OneToMany(fetch = FetchType.EAGER, mappedBy = "categorie", cascade = CascadeType.ALL)
    	    private Collection <Question> questions; 
    	    public Categorie(){
    	super();
     
    }
    public int getId() {
    	return id;
    }
    public void setId(int id) {
    	this.id = id;
    }
    public String getType() {
    	return type;
    }
    public void setType(String type) {
    	this.type = type;
    }
    public Categorie(String type) {
    	super();
    	this.type = type;
    }
    public Collection<Question> getQuestions() {
    	return questions;
    }
    public void setQuestions(Collection<Question> questions) {
    	this.questions = questions;
    }
    }
    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    package tn.esen.entities;
    import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.FetchType;
    import javax.persistence.GeneratedValue;
    import javax.persistence.GenerationType;
    import javax.persistence.Id;
     
    import javax.persistence.ManyToMany;
    import javax.persistence.ManyToOne;
    import javax.persistence.OneToMany;
     
    import java.io.Serializable;
    import java.util.Collection;
    import java.util.Date;
    @Entity
    public class Question implements Serializable {
    	/**
             * 
             */
    	private static final long serialVersionUID = 1L;
    	@Id
    	@GeneratedValue(strategy=GenerationType.IDENTITY)
    	@Column(name="id_question")		
    	private int id;
        private String contenu;    
    	private String niveauDeDifficulte;
            private Date dateCreation;
            @OneToMany(mappedBy="question",fetch = FetchType.EAGER)
            private Collection <Reponse> reponses; 
            @ManyToOne
             private Categorie categorie;
            @ManyToOne
             private Administrateur administrateur;
            @ManyToMany(mappedBy = "questions")
            private Collection<Test> tests;
    public Question(){
    	super();
    }
     
    @Override
    public String toString() {
    	return "Question [id=" + id + ", contenu=" + contenu + ", niveauDeDifficulte=" + niveauDeDifficulte + "]";
    }
     
    public int getId() {
    	return id;
    }
     
    public void setId(int id) {
    	this.id = id;
    }
     
     
    public String getContenu() {
    	return contenu;
    }
     
    public void setContenu(String contenu) {
    	this.contenu = contenu;
    }
     
    public String getNiveauDeDifficulte() {
    	return niveauDeDifficulte;
    }
     
    public void setNiveauDeDifficulte(String niveauDeDifficulte) {
    	this.niveauDeDifficulte = niveauDeDifficulte;
    }
     
     
    public Date getDateCreation() {
    	return dateCreation;
    }
     
    public void setDateCreation(Date dateCreation) {
    	this.dateCreation = dateCreation;
    }
     
     
    public Collection<Reponse> getReponses() {
    	return reponses;
    }
     
    public void setReponses(Collection<Reponse> reponses) {
    	this.reponses = reponses;
    }
     
    public Categorie getCategorie() {
    	return categorie;
    }
     
    public void setCategorie(Categorie categorie) {
    	this.categorie = categorie;
    }
     
    public Administrateur getAdministrateur() {
    	return administrateur;
    }
     
    public void setAdministrateur(Administrateur administrateur) {
    	this.administrateur = administrateur;
    }
     
    public Collection<Test> getTest() {
    	return tests;
    }
     
    public void setTest(Collection<Test> tests) {
    	this.tests = tests;
    }
     
    public Question(String contenu, String niveauDeDifficulte, Date dateCreation) {
    	super();
    	this.contenu = contenu;
    	this.niveauDeDifficulte = niveauDeDifficulte;
    	this.dateCreation = dateCreation;
    }
    }

  4. #4
    Membre chevronné
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 348
    Points : 1 787
    Points
    1 787
    Par défaut
    Il te suffit de préciser la categorie de la question comme paramètre de la requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public List<Question> prepareRandomTest(int number_of_questions, Categorie categorie){ 
    		  String jpql = "SELECT q FROM Question q WHERE q.categorie=:categorie ORDER BY RANDOM() LIMIT "+number_of_questions  ;
    		 Query query = entityManager.createQuery(jpql).setParameter("categorie",categorie);
    		 entityManager.persist(Question.class);
    		  return query.getResultList();
    		}
    Au passage, ça serait mieux que number_of_questions soit également un paramètre de la requête, et accessoirement qu'il soit nommé correctement pour une variable

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2016
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2016
    Messages : 65
    Points : 36
    Points
    36
    Par défaut
    Citation Envoyé par chtig Voir le message
    Il te suffit de préciser la categorie de la question comme paramètre de la requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public List<Question> prepareRandomTest(int number_of_questions, Categorie categorie){ 
    		  String jpql = "SELECT q FROM Question q WHERE q.categorie=:categorie ORDER BY RANDOM() LIMIT "+number_of_questions  ;
    		 Query query = entityManager.createQuery(jpql).setParameter("categorie",categorie);
    		 entityManager.persist(Question.class);
    		  return query.getResultList();
    		}
    Au passage, ça serait mieux que number_of_questions soit également un paramètre de la requête, et accessoirement qu'il soit nommé correctement pour une variable
    Merci j'ai implémenté la méthode avec succès ça marche dans le main mais le probléme est que les questions ne sont pas affichés aléatoirement or JPQL ne supporte pas la fonction RANDOM() avez vous une idée pour m'aider à faire afficher les question aléatoirement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    	@Override
    	public List<Question> prepareRandomTest(int number_of_questions, Categorie categorie, String niveauDeDifficulte){ 
     
    			  String jpql = "SELECT q FROM Question q where q.categorie=:categorie and q.niveauDeDifficulte=:niveauDeDifficulte";
    			  Query query = entityManager.createQuery(jpql);
    			  query.setParameter("categorie", categorie).setParameter("niveauDeDifficulte", niveauDeDifficulte);
    			  query.setMaxResults(number_of_questions);
    			  List<Question> result = query.getResultList();
    			  Collections.shuffle(result);
    			  return result;

  6. #6
    Membre chevronné
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 348
    Points : 1 787
    Points
    1 787
    Par défaut
    ne fonctionne pas non plus?

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2016
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2016
    Messages : 65
    Points : 36
    Points
    36
    Par défaut
    Citation Envoyé par chtig Voir le message
    ne fonctionne pas non plus?
    Voilà c'est ça le probléme puisque JPQL ne support Random() et moi je dois afficher les questions de maniére aléatoire.

  8. #8
    Membre chevronné
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 348
    Points : 1 787
    Points
    1 787
    Par défaut
    Je ne suis pas super familier du jpql (j'utilise hibernate et en hibernate tu peux faire un order by rand). Mais si tu n'as pas de possibilité de le faire en jpql, il ne reste que la solution de remonter tous les résultats en java (donc pas de limit), de faire ensuite un shuffle sur la collection et de prendre les n premiers

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 20/10/2015, 08h21
  2. Quel est le problème dans cette ligne ?
    Par alaa1993 dans le forum Android
    Réponses: 7
    Dernier message: 31/01/2014, 12h54
  3. problème dans l'appel d'une methode
    Par aishaDev dans le forum JSF
    Réponses: 12
    Dernier message: 28/06/2012, 12h00
  4. Où est le problème dans cette méthode ?
    Par Stéphane Bruckert dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 19/03/2009, 17h00
  5. Problème dans requête avec count()
    Par BadFox dans le forum Requêtes
    Réponses: 3
    Dernier message: 08/07/2003, 18h02

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