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 :

Utiliser des champs calculé dans un criteria Hibernate


Sujet :

Hibernate Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 200
    Points : 66
    Points
    66
    Par défaut Utiliser des champs calculé dans un criteria Hibernate
    Bonsoir,

    mon problème paraît simple mais il ne l'est pas tant que ça
    Je rencontre un problème pour ordonner un champs d'une requête.

    Actuellement je ramène les valeurs dans cet ordre :
    1
    10
    2
    3
    .. jusqu'à
    9

    Je souhaiterais les ramener dans cet ordre:
    1
    2
    3
    .. jusqu'à
    10

    Le champs en question est de type String.
    Je souhaiterais donc le convertir dans mon modèle Hibernate en Integer ou Double pour que les valeurs du champs ramenées soient correctement ordonnées.

    J'utilise la requête Hibernate suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     DetachedCriteria controlPointsCriteria = DetachedCriteria.forClass(ControlPoints.class);
     controlPointsCriteria.add(Restrictions.eq(ControlPoints.CPO_PREPARATION_PHASE, preparationPhase));
     controlPointsCriteria.addOrder(Order.asc("cpoRefNumCalc"));
    Où mon champs "cpoRefNumCalc" représente un champs calculé dans mon modèle Hibernate:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
      @Formula(value = "cast(cpoRefNum as signed)")
        private double cpoRefNumCalc;
     
        public double getCpoRefNumCalc() {
            return cpoRefNumCalc;
        }
     
        public void setCpoRefNumCalc(double cpoRefNumCalc) {
            this.cpoRefNumCalc = cpoRefNumCalc;
        }
    Cela devrait fonctionner, mais le champs calculé n'est pas remplacé dans la requête effectuée par Hibernate.

    J'obtiens une requête SQL du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select this_.cpoRefNumCalc as cpoRefNu7_8_1_
    from CONTROL_POINTS this_ inner join PREPARATION_PHASES preparatio2_ on this_.CPO_FK_PHASE_ID=preparatio2_.PRP_ID
    order by this_.cpoRefNumCalc asc
    J'ai essayé de trouvé d'autres solutions mais je bloque là.
    Avez-vous une piste svp ?

    Merci de votre aide,
    berni.

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 937
    Points : 4 358
    Points
    4 358
    Par défaut
    Citation Envoyé par bernidupont Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     DetachedCriteria controlPointsCriteria = DetachedCriteria.forClass(ControlPoints.class);
     controlPointsCriteria.add(Restrictions.eq(ControlPoints.CPO_PREPARATION_PHASE, preparationPhase));
     controlPointsCriteria.addOrder(Order.asc("cpoRefNumCalc"));
    la classe criterion.Order (du moins jusqu'à Hibernate 4.x, à vérifier si un JIRA existe et à été fixé...) ne s'occupe pas de @Formula : suffit d'ouvrir son code source !
    (en fait c'est Dialect.renderOrderByElement qui fait le boulot de bas niveau)

    essayez de remplacer le dernier addOrder par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    controlPointsCriteria.add(Restrictions.sqlRestriction("1=1 order by cast(this_.cpoRefNum as signed) asc");
    
    cela devrait générer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select this_.cpoRefNumCalc as cpoRefNu7_8_1_
    from 3D_REPORTING.CONTROL_POINTS this_ inner join 3D_REPORTING.PREPARATION_PHASES preparatio2_ on this_.CPO_FK_PHASE_ID=preparatio2_.PRP_ID
    and 1=1 order by cast(this_.cpoRefNum as signed) asc
    ... mais dans ce cas-ci cela serait plus propre de directement faire le query natif...
    jamais l'idéal d'utiliser la connaissance des alias utilisés par le convertisseur dans le code Java...

  3. #3
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Et je me poserais la question du bien fondé d'aller mettres des nombres dans un varchar en db

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 200
    Points : 66
    Points
    66
    Par défaut
    A défaut de pouvoir le faire depuis le modèle, la solution de restriction convient bien.
    Merci JeitEmgie.

    tchize_ ce champs est utilisé dans une jointure et les performances sont meilleures avec une jointure en varchar.

  5. #5
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par bernidupont Voir le message
    tchize_ ce champs est utilisé dans une jointure et les performances sont meilleures avec une jointure en varchar.
    Hé ben, en 14 ans de carrière, c'est la première fois que je l'entends celle là, des varchar plus rapide en jointure que des nombres natifs. Je veux bien te croire mais là j'ai besoin de contexte, t'es occupé d'ébranler toute ce que je croyais savoir sur les bases de données.

Discussions similaires

  1. [XL-2010] Totaux des champs calculés dans un TCD
    Par jpg75014 dans le forum Excel
    Réponses: 4
    Dernier message: 16/10/2015, 15h57
  2. Réponses: 2
    Dernier message: 28/07/2013, 22h58
  3. Ré utiliser des champs calculés dans une requête
    Par boby62423 dans le forum Développement
    Réponses: 6
    Dernier message: 11/03/2011, 16h43
  4. [A07] Tri sur des champs calculé dans un etat
    Par Thierry'' dans le forum IHM
    Réponses: 2
    Dernier message: 02/02/2009, 08h31
  5. Récupérer la valeur des champs calculés dans une requète SQL dans vba
    Par FrédéricCM dans le forum Requêtes et SQL.
    Réponses: 12
    Dernier message: 28/06/2006, 16h29

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