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

Hibernate Java Discussion :

Hibernate : Criteria et Projection Liste


Sujet :

Hibernate Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Inscrit en
    Août 2010
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 7
    Par défaut Hibernate : Criteria et Projection Liste
    Bonjour à tous,


    j'ai éssayer d'utliser criteria avec projections Liste pour utiliser groupby et orderby ensemble mais mon probléme ce que la liste retourner est un Liste des objets et n'accepte pas le casting en type Liste de "StockSituationstock" la classe qui represente mon table StockSituation qui est dans la base de données oracle
    Information : j'utilise hibernate et "StockSituationstock" c'est l'entity qui répresente la table en BD Oracle
    mais ce bout de code

    Code Java :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Criteria crt = getSession().createCriteria(StockSituationstock.class);
    				crt.setProjection(Projections.projectionList().add(Projections.groupProperty("stockArticle.comp_id.codearti")).add(Projections.groupProperty("stockArticle.comp_id.codemaga")).add(Projections.max("datesitu")));//.addOrder(Order.desc("datesitu"));
     List res=crt.list(); // retourne Liste de type Object et n'accepte pas le casting en type StockSituationstock
    Merci pour votre aide

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 24
    Par défaut
    Salut,

    Tu effectues une projection de certains attributs, à partir de ce moment là, le "cast" direct ne sera pas effectif, l'objet étant "incomplet".

    Une solution à ton problème consiste à utiliser un ResultTransformer afin de bien préciser à ton critère que la requête renvoie bien un objet d'un type précis.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    crt.setResultTransformer(Transformers.aliasToBean(StockSituationstock.class));
    Ainsi, une instance du bean StockSituationstock sera peuplé à l'exécution de ta requête et tu pourras faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     List<StockSituationstock> res=crt.list();
    Voilà !!!

  3. #3
    Membre régulier
    Inscrit en
    Août 2010
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 7
    Par défaut
    Bonjour,


    j'ai essayer avec l'instruction de Transformer que vous m'avez dit, le casting ça marche bien mais les champs de bean retournés sont null.
    j'ai testé avec l'affichage de la taille de la liste il affiche les nombres de lignes retourner correctement ce qui implique que la réquete criteria marche bien mais les champs de bean retourner sont null


    Merci pour votre aide

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 24
    Par défaut
    Tu fais une projection, c'est-à-dire que excepté si tu fais une projection sur tous les attributs (SELECT *), tu vas "limiter" les champs retournés.

    Ainsi, les champs se trouvant dans ta projection seront bien peuplés dans ton bean, mais ceux qui ne s'y trouvent pas seront NULL.

    Ainsi, je te donne un exemple : imaginons un objet A avec les champs (champ1,champ2,champ3,champ4).

    Si je souhaite récupérer seulement champ1 et champ2 je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    crit.setProjection(Projections.projectionList()
    		.add(Property.forName("champ1"),"champ1")
    		.add(Property.forName("champ2"),"champ2")
    Puis j'effectue le resultTransformer et l'appel à la requête ce qui implique le peuplement expliqué plus haut.

    Cependant, les champs champ3 et champ4 seront NULL car non projetés.

    Ainsi, fais attention aux champs que tu souhaites retourner, à mon avis s'ils sont NULL c'est qu'ils n'apparaissent pas dans ta projection.

    En espérance avoir été clair.

  5. #5
    Membre régulier
    Inscrit en
    Août 2010
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 7
    Par défaut
    Merci bien Fearless pour votre aide

    ça marcher mais j'ai un problème avec les clé composer si je met Proprety.forname()

    j'ai ajouter ce ligne de code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    crt.setProjection(Projections.projectionList().add(Property.forName("datesitu"),"datesitu").add(Property.forName("comp_id"),"comp_id"));
    il m'affiche l'exception
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    org.hibernate.QueryException: property does not map to a single column: comp_id
    	at org.hibernate.loader.criteria.CriteriaQueryTranslator.getColumn(CriteriaQueryTranslator.java:371)
    	at org.hibernate.criterion.PropertyProjection.toSqlString(PropertyProjection.java:41)
    	at org.hibernate.criterion.AliasedProjection.toSqlString(AliasedProjection.java:27)
    	at org.hibernate.criterion.ProjectionList.toSqlString(ProjectionList.java:49)
    Merci pour votre aide
    pour plus d'information dans le fichier hbm ça marche bien avec le proprety

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <property
            name="datesitu"
            type="java.sql.Date"
            column="DATESITU"
            length="7"
        />
    mais avec le clé composé il m'affiche l'erreur cité précedement

    Dans fichier hbm comp_id
    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
    <composite-id name="comp_id" class="entity.StockSituationstockPK">
            <key-property 
                name="joursitu" 
                column="JOURSITU" 
                type="java.math.BigDecimal"
                length="22"
            />
            <key-property 
                name="moissitu" 
                column="MOISSITU" 
                type="java.math.BigDecimal"
                length="22"
            />
            <key-property 
                name="annesitu" 
                column="ANNESITU" 
                type="java.math.BigDecimal"
                length="22"
            />
        </composite-id>


    Merci pour votre aide

Discussions similaires

  1. [Hibernate]Alias et projections
    Par kausa dans le forum Hibernate
    Réponses: 5
    Dernier message: 04/12/2007, 16h14
  2. hibernate-criteria : jointure sur plusieurs tables
    Par loic72 dans le forum Hibernate
    Réponses: 9
    Dernier message: 24/09/2007, 17h27
  3. [Hibernate] Criteria sur différence entre deux dates ?
    Par Invité dans le forum Hibernate
    Réponses: 1
    Dernier message: 27/06/2007, 10h10
  4. [Hibernate] Criteria Year
    Par Fr@ncky dans le forum Hibernate
    Réponses: 1
    Dernier message: 06/02/2006, 09h38
  5. Réponses: 2
    Dernier message: 26/09/2005, 09h55

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