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 :

Restrictions.sqlRestrictions + to_date Oracle + alias = Galere


Sujet :

Hibernate Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Inscrit en
    Septembre 2009
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 11
    Par défaut Restrictions.sqlRestrictions + to_date Oracle + alias = Galere
    Bonjour,

    Souhaitant faire une simple requête utilisant la fonction to_date de Oracle dans un criteria, je dois m'avouer un peu perdu avec l'alias Hibernate !

    Dans le manuel de référence hibernate, les exemples utilisant des "Restrictions.sqlRestriction" s'effectue sur une simple classe. Or, dans mon cas, la hiérarchie de classe est un plus complexe. Considérons le cas suivant :

    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
     
    public class Camion {
      private String nomChauffeur;
      ...
      private Set<PneuCamion> pneuxCamion;
      ...
    }
     
    public class PneuCamion {
      ...
      // Table BDD : Pneux_Camion
      // Champ BDD : Date_Montage 
      private DateTime dateMontage;
     
      public String getDateMontageAsString() {
        return dateMontage.toString("dd/MM/yyyy");
      }
    }
    Dans cet exemple, un Camion (table Camion) possède plusieurs PneuCamion (table PneuxCamion). Pour chacun des PneuCamion, un attribut renseigne sur la date à laquelle le pneu a été changé (dateMontage).
    Ainsi, je souhaiterai récupérer l'ensemble des objets Camion pour lesquels les pneux ont été changé avant le 12 décembre 2005. Travaillant sur une base Oracle, j'effectue le critère suivant sachant que la table Pneux_Camion contient le champ Date_Montage :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ...
    Criteria criteria = session.createCriteria(Camion.class);
    criteria.createAlias("pneuxCamion", "pneux");
    criteria.add(Restrictions.sqlRestriction("to_date({pneux}.Date_Montage, 'dd/mm/rrrr')< to_date('12/12/2005','dd/mm/rrrr')"));
    List camions = criteriaTest2.list();
    En réalisant ce critère, je constate que Hibernate n'arrive pas à créer la relation entre mon alias et j'obtiens l'erreur suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Hibernate: select this_.ID_CAMION as ID1_26_1_, this_.NOM_CHAUFFEUR as NOM9_26_1_, this_.MIS_NO_CONTRAT as MIS10_26_1_, this_.MIS_TYPE_CONTRAT as MIS11_26_1_, this_.MIS_SALARIEDE as MIS13_26_1_, pneux1_.ID_CAMION as ID1_24_0_, pneux1_.DATE_MONTAGE as DATE24_0_ from DAT_FSURETE this_ inner join PNEUX_CAMION pneux1_ on this_.ID_CAMION=pneux1_.ID_CAMION where to_date(pneux.DATE_MONTAGE, 'dd/mm/rrrr')< to_date('12/12/2005','dd/mm/rrrr') 
    11:09:58 WARN JDBCExceptionReporter: SQL Error: 904, SQLState: 42000
    11:09:58 ERROR JDBCExceptionReporter: ORA-00904: "PNEUX"."DATEMONTAGE" : identificateur non valide
    Du coup, je me pose la question de savoir si Hibernate est capable de traiter les alias "perso" dans un Restrictions.sqlRestriction ?
    Avez-vous rencontrer le même problème et quels sont els axes de solution ?

    Merci !

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 79
    Par défaut
    si on regarde le code source de criterion on a
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public class SQLCriterion implements Criterion {
     
    	private final String sql;
    	private final TypedValue[] typedValues;
     
    	public String toSqlString(
    		Criteria criteria,
    		CriteriaQuery criteriaQuery)
    	throws HibernateException {
    		return StringHelper.replace( sql, "{alias}", criteriaQuery.getSQLAlias(criteria) );
    	}
    il faut mettre {alias} qui fait référence au this du criteria
    et non préciser le type entre { } c'est vraiment {alias} qu'il faut mettre
    j'aurais bien aimé que l'on puisse mettre la property en java genre {alias.machin}, mais on ne peut pas non plus

Discussions similaires

  1. utilisation de Restrictions.sqlRestriction
    Par ClimberAhead dans le forum Hibernate
    Réponses: 4
    Dernier message: 18/08/2010, 13h21
  2. Criteria + Restrictions.sqlRestriction
    Par saveThyCheerleader dans le forum Hibernate
    Réponses: 0
    Dernier message: 15/04/2009, 19h22
  3. To_date() / Oracle 10
    Par jnauche dans le forum SQL
    Réponses: 1
    Dernier message: 11/06/2008, 12h57
  4. [Oracle] Fonction to_date
    Par Run_974 dans le forum Langage SQL
    Réponses: 10
    Dernier message: 16/08/2007, 17h16
  5. [Oracle 9.2]Utiliser un alias dans une contrainte ?
    Par belfaigore dans le forum Oracle
    Réponses: 5
    Dernier message: 29/06/2005, 14h18

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