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

Grails Java Discussion :

Domain class perd des infos dans une liste


Sujet :

Grails Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 29
    Par défaut Domain class perd des infos dans une liste
    Bonjour à tous,

    J'ai une relation manyToMany, décomposée en 2 relations oneToMany et inversement pour ajouter à la classe intermédiaire un champ supplémentaire. Lorsque je récupère ma classe Profil, liée à Compétence (classe intermédiaire), possédant elle même plusieurs relations avec Specialité, j'ai bizarrement le retour d'une liste de compétences avec une unique spécialité.
    Ce problème ne semble survenir qu'après une CriteriaQuery qui effectue une recherche sur les profils possédant une spécialité recherchée.

    Voici une partie du code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    class Profil {
     
         String firstName;
         String lastName;
         Date naissance;
         String telephone;
         String email;
    //...
       static hasMany = [competences:Competence];
        Set competences
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class Specialite {
     
        String libelle;
     
        static hasMany = [competences:Competence];
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    class Competence {
     
        Integer noteMaitrise;
        Profil profils
        Specialite specialites
     
        static belongsTo = [specialites:Specialite, profils:Profil];
        //Set specialites
     
         String toString(){
            return("${specialites.libelle}");
        }
    }

    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
    def searchOnProfil = {
            def c = Profil.createCriteria()
            def results = []
            if(params.keywordOnCompetences != null){
                results = c.list{
                    competences{
                        specialites{
                            ilike("libelle", "%"+ params.keywordOnCompetences +"%")
                        }
                    }
                }
                println "END RESEARCH"
            }
     
            if(results.size() != 0){
                //debug
                println("nombre de résultats : " + results.size())
                def fullResults = []
                results.each{
                    println it.class
                    //fullResults.add(Profil.get(it.id))
                }
                flash.message = "Résultats retournés : "+results.size()
                chain(controller:"recherche", action:"list", model:["resultsList":results])
            }else{
                flash.message = "Aucun profil correspondant"
                chain(controller:"profil", action:"list")
            }
        }
    Merci d'avance pour votre aide.

  2. #2
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2005
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 218
    Par défaut
    J'ai regardé rapidement ton code, et j'ai repéré deux anomalies, une de logique :

    Une compétence n'appartient qu'à une spécialité et un profil, donc pas de pluriels sur specialité et profil et d'autres part si tu déclares tes propriétés dans le belongsTo tu n'as pas à les déclarer de nouveau dans ta classe.

    static belongsTo = [specialites:Specialite, profils : Profil];
    A supprimer de la classe compétence :
    Profil profils
    Specialite specialites

    cdlt.

  3. #3
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2005
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 218
    Par défaut
    Lorsque je récupère ma classe Profil, liée à Compétence (classe intermédiaire), possédant elle même plusieurs relations avec Specialité
    Dans la classe Compétence que tu as écrit, tu n'as réellement aucune relation entre Spécialité et Profil.

    Si Competence possède plusieurs Spécialités, ta classe compétence devrait être définie comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class Competence {
     
        Integer noteMaitrise; 
        static belongsTo = [profil:Profil];
        static hasMany= [specialites:Specialite];
        //Set specialites
     
         String toString(){
            return("${specialites.libelle}");
        }
    }

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 29
    Par défaut
    Citation Envoyé par macumba Voir le message
    J'ai regardé rapidement ton code, et j'ai repéré deux anomalies, une de logique :

    Une compétence n'appartient qu'à une spécialité et un profil, donc pas de pluriels sur specialité et profil et d'autres part si tu déclares tes propriétés dans le belongsTo tu n'as pas à les déclarer de nouveau dans ta classe.

    static belongsTo = [specialites:Specialite, profils : Profil];
    A supprimer de la classe compétence :
    Profil profils
    Specialite specialites

    cdlt.
    Merci de ta réponse. En ce qui concerne le nom, je m'en étais fait la réflexion, sans pour autant l'appliquer à cause d'une certaine flemme

    Quant à l'ajout des propriétés, c'est seulement en les déclarant hors de la liste belongsTo, que j'avais réussi à effectuer la requête.
    Ce qui me dérange en réalité, c'est que je récupère des objets profils qui semblent être complets mais auxquels il manque une partie essentiel, et j'arrive pas à savoir pourquoi


    Quant à la classe Competence, elle réunit un profil (Tartempion) qui possède une spécialité (Java, DotNet ou ASM par exemple), de manière à noter l'aptitude de chacun en la matière. Du coup c'est la table intermédiaire de la relation manyToMany entre Profil et Specialite.

  5. #5
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2005
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 218
    Par défaut
    Quant à l'ajout des propriétés, c'est seulement en les déclarant hors de la liste belongsTo, que j'avais réussi à effectuer la requête.
    Je te confirme qu'il n'y a pas à redéclarer, en dehors du belongsTo ou du hasMany, j'ai énormément de ce type de relation dans mes projets et cela fonctionne, vérifie peut-être dans ta base si tu n'as pas plusieurs champs générés qui poseraient pb. La seule chose dont je ne me sers pas c'est le ilike. Il ya également le Set competences à supprimer de la classe Profil que je n'avais pas vu.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class Profil {
     
         String firstName;
         String lastName;
         Date naissance;
         String telephone;
         String email;
    //...
       static hasMany = [competences:Competence];
        <s>Set competences</s>}
    Tu ne peux pas sinon mettre une trace sur ta base pour voir la requête exécutée? Ce serait plus facile de comprendre ce qui ne va pas.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 29
    Par défaut
    Pour l'instant je reste avec la base générée par grails, avec HSQLDB, en remplissant ma DB factice avec le bootstrap. Et comme c'est ma première fois avec grails, je ne sais pas comment accéder à la DB. T'aurais pas un lien sous le coude ?

    Et pour revenir sur le belongsTo et le manyToOne, j'avais appliqué tes conseils, finalement sans soucis. Je m'en vais virer le Set machinchose.

  7. #7
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2005
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 218
    Par défaut
    Désolé, je travaille quasimment depuis le début avec Postgres. Je n'ai absolument pas de connaissances sur HQLDB.

    Mais, si tu as laissé la propriété dbCreate à create-drop (et non à update) dans le Datasource.groovy,en principe il ne devrait pas y avoir les pbs liés à des champs parasites de classes.

    Sinon pour la requete results = c.list{
    je fais systématiquement c.list(){,
    je ne déclare jamais mes resultats comme ca
    def results = []
    je les déclare simplement
    def results
    et je teste si results == null par la suite

    ...mais je ne suis pas convaincu que le pb vienne de là.


    Si tu fais une requete pour compter ca te donne le bon nombre d'enreg?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    c.get{
                    competences{
                        specialites{
                            ilike("libelle", "%"+ params.keywordOnCompetences +"%")
                        }
                    }
                    projections {
    		countDistinct('id')
    	   }
                }

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

Discussions similaires

  1. Intercaler des "titres" dans une liste ?
    Par tikawua dans le forum Langage SQL
    Réponses: 3
    Dernier message: 18/10/2005, 10h40
  2. [MySQL] Chercher des info dans une DB, et les afficher en lien
    Par pierrot10 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 12/10/2005, 19h29
  3. [Lisp] Suppression des parenthèses dans une liste
    Par bourdaillet dans le forum Lisp
    Réponses: 3
    Dernier message: 19/12/2004, 21h02
  4. [langage] Comment rajouter des champs dans une liste
    Par toto_titi dans le forum Langage
    Réponses: 4
    Dernier message: 28/08/2003, 14h09

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