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 + implémentation like pour champ de type Number


Sujet :

Hibernate Java

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2004
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 118
    Par défaut Hibernate + implémentation like pour champ de type Number
    Bonjour,

    dans une base oracle, j'ai un champ exercice où on stocke des années
    sous la forme de "Number(4)".
    J'utilise Hibernate et je souhaite pouvoir effectuer une recherche en
    disant "renvoie moi toutes les dates qui commencent par : 20 par
    exemple", en gros un sorte de 'like' mais pour du numérique.

    Pour cela j'ai crée la classe suivante :

    /**
    * Classe permettant d'effectuer l'équivalent d'un 'like' sur
    * une propriété numérique (Number ou Integer)
    */
    public class LikeIntegerExpression implements Criterion
    {
    private String propertyName;
    private Integer value;

    public LikeIntegerExpression(String propertyName, Integer value) {
    this.propertyName = propertyName;
    this.value = value;
    }

    public String toSqlString(Criteria criteria, CriteriaQuery
    criteriaQuery) throws HibernateException {

    String[] columns = criteriaQuery.getColumnsUsingProjection(criteria,
    propertyName);
    Type type = criteriaQuery.getTypeUsingProjection(criteria,
    propertyName);
    StringBuffer fragment = new StringBuffer();

    if (columns.length > 1) {
    fragment.append('(');
    }

    SessionFactoryImplementor factory = criteriaQuery.getFactory();
    int[] sqlTypes = type.sqlTypes( factory );

    for ( int i=0; i<columns.length; i++ ) {
    fragment.append("to_char(" + columns[i] + ") like '" +
    value.intValue() + "%'");

    if ( i < columns.length-1 ) {
    fragment.append(" and ");
    }
    }

    if (columns.length>1) {
    fragment.append(')');
    }

    return fragment.toString();
    }

    public TypedValue[] getTypedValues(Criteria criteria, CriteriaQuery
    criteriaQuery) throws HibernateException {
    //Object icvalue = value;
    return new TypedValue[] { criteriaQuery.getTypedValue(criteria,
    propertyName, value) };
    }

    }

    Hibernate effectue bien la requete, mais il plante juste après en
    disant : «
    [ERROR JDBCExceptionReporter] Index de colonne non valide

    [11:33:45.588]
    org.hibernate.util.JDBCExceptionReporter.logExceptions(JDBCExceptionReporter.java:72)
    Exception : Une erreur non typée a été levé : could not execute
    query »

    Si j'effectue la requête générée par Hibernate sous Toad, la requête
    s'exécute bien...

    Je pense que mon erreur vient de l'implémentation de la méthode : «
    public TypedValue[] getTypedValues(Criteria criteria, CriteriaQuery
    criteriaQuery) » car je n'ai pas très bien compris ce que doit faire
    cette méthode ? Qu'en pensez-vous ?

    HELP ME !!!
    Merci d'avance.

    Fabien

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 163
    Par défaut Tu peux faire ça facilement avec...
    Les requêtes Criteria, voir chapitre correspondant dans la doc Hibernate, sont très efficaces pour ça, t'as un like, avec des caractères joker... Ya des exemples clairs...

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2004
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 118
    Par défaut
    Oui mais tu ne peux pas faire de like sur un champ numérique ;
    cela ne marche pas !!!!

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 163
    Par défaut Sinon, tu peux faire :
    J'ai effectivement vu que les like marchait pas avec du numérique, même via des MatchMode...

    par contre, si tu veux des dates commencent par...
    Tu peux contourner le pb, en fesant des setFirstResult à 2000, et un setMaxResult...
    ou bien en fesant un where date<2500 ans date>2000...

    A moins que ça ne corresponde pas à ton cas de figure !

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2004
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 118
    Par défaut
    Et non, je ne gère pas des dates mais des "Number" et des integer...

    Quel est le rôle de cette méthode : public TypedValue[] getTypedValues(Criteria criteria, CriteriaQuery
    criteriaQuery) throws HibernateException qui se trouve dans l'interface Criterion ???

    En tout cas, elle permet manifestement le déclenchement de la requête et cela plante juste après...

    HELP ME HELP ME !!!

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 163
    Par défaut
    Si t'as juste des numbers, fait des SetMaxResult... non ?
    Ca donne pas le résultat que tu veux ?

  7. #7
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2002
    Messages : 652
    Par défaut
    Il n'est pas possible de faire de like sur autre chose que des chaines de caractère en SQL donc, Hibernate ne fera pas mieux lui même.

    Pour un like 20% il te faudras convertir ton numérique en chaine et ensuite appliquer le like.

    Ne pas oublier qu'hibernate est un outil de mapping, pour toute requêtes spécifique, utliser le SQL est préférable (dixit hibernate)

Discussions similaires

  1. [HTML 5] Nombre maximal de caractères pour le champ de type number
    Par Robjerey dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 27/03/2015, 13h29
  2. minimum et maximum pour input text type number
    Par VIRGINIE87 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 05/04/2012, 10h20
  3. Réponses: 3
    Dernier message: 28/04/2008, 16h23
  4. [TYPE DE CHAMPS] Quel type pour une primary key ?
    Par guy2004 dans le forum SQL Procédural
    Réponses: 4
    Dernier message: 25/03/2006, 12h23
  5. [Modélisation] Type de champs pour champs récurents ?
    Par shadeoner dans le forum Décisions SGBD
    Réponses: 4
    Dernier message: 24/03/2006, 11h29

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