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

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 29
    Points : 25
    Points
    25
    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 averti
    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
    Points : 311
    Points
    311
    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 averti
    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
    Points : 311
    Points
    311
    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
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 29
    Points : 25
    Points
    25
    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 averti
    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
    Points : 311
    Points
    311
    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
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 29
    Points : 25
    Points
    25
    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 averti
    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
    Points : 311
    Points
    311
    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')
    	   }
                }

  8. #8
    Membre averti
    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
    Points : 311
    Points
    311
    Par défaut
    Je viens de tomber sur ca en cherchant autre chose dans la doc grails :
    Setting properties in the Criteria instance
    If a node within the builder tree doesn't match a particular criterion it will attempt to set a property on the Criteria
    object itself. Thus allowing full access to all the properties in this class. The below example calls setMaxResults
    and setFirstResult on the Criteria instance:
    import org.hibernate.FetchMode as FM

    def results = c.list {
    maxResults(10)
    firstResult(50)
    fetchMode("aRelationship", FM.JOIN)
    }
    A priori il faut au moins un critère pour qu'une requete marche. Comme tu n'as aucun critère sur la table principale, essaie ptet d'ajouter maxResults(1000) à la fin de ton createCriteria...

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 29
    Points : 25
    Points
    25
    Par défaut
    Merci pour tes réponses, j'ai fini par faire autrement. Au lieu de créer ma criteria, qui finalement ne convenait que dans un cas simple, je crée ma requête HQL à la mano puis je fais un Profil.execute(query). J'ai un problème de merde à la suite de passages des résultats d'une closure à une autre (donc d'une url à une autre d'après GRails), résolue par le traitement dans l'url de destination (donc les résultats ne se traînent pas d'une closure à une autre, et j'ai toujours pas compris pourquoi j'avais une erreur hibernate de lazy loading, surtout que par défaut les associations en grails sont chargées en eager).

    D'un autre côté j'ai eu une couille avec les tables requétées, une fois il se basait sur HQL (donc nom des propriétés des classes) et l'autre sur du SQL (donc nom colonnes de la base). J'ai cru devenir dingue avant de trouver l'astuce et de renommer mes champs. Bref les merdes habituelles qu'on aime tous !

    (au fait, entre temps je suis passé sur du MySQL, histoire de voir comment les données étaient ajoutées ; c'est bien plus pratique que de bosser à l'aveugle avec HQLDB)

+ 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