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

JPA Java Discussion :

Criteria Double et Like


Sujet :

JPA Java

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 109
    Par défaut Criteria Double et Like
    Bonjour (ou re)

    Je n'arrive pas à faire fonctionner mon criteria avec les type double et les like, je plante tout le temps. Voici ma méthode :

    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    public List<Book> getBooksByMultiCriteria(String title, String editor, String isbn13, Double price) {
    
    		CriteriaBuilder cb = em.getCriteriaBuilder();
    		CriteriaQuery<Book> query = cb.createQuery(Book.class);
    
    		Root<Book> select = query.from(Book.class);
    
    		if (title != null && !title.isEmpty()) {
    			query.where(cb.equal(select.<String> get("title"),
    					cb.parameter(String.class, "titleSearched")));
    		}
    		if (editor != null && !editor.isEmpty()) {
    			query.where(cb.equal(select.<String> get("editor"),
    					cb.parameter(String.class, "editorSearched")));
    		}
    		if (isbn13 != null && !isbn13.isEmpty()) {
    			query.where(cb.like(select.<String> get("isbn13"), // PLANTE
    					cb.parameter(String.class, "isbn13Searched")));
    		}
    		if (price != null && price != 0.0) {
    			query.where(cb.equal(select.<Double> get("price"), // PLANTE
    					cb.parameter(Double.class, "priceSearched")));
    		}
    
    		TypedQuery<Book> typedQuery = em.createQuery(query);
    
    		if (title != null && !title.isEmpty()) {
    			typedQuery.setParameter("titleSearched", title);
    		}
    		if (editor != null && !editor.isEmpty()) {
    			typedQuery.setParameter("editorSearched", editor);
    		}
    		if (isbn13 != null && !isbn13.isEmpty()) {
    			typedQuery.setParameter("isbn13Searched", "*" + isbn13 + "*");
    		}
    		if (price != null && price != 0.00) {
    			typedQuery.setParameter("priceSearched", price);
    		}
    
    		List<Book> BooksCriter = typedQuery.getResultList();
    
    		return BooksCriter;
    J'ai appris à faire comme ça en cours pour criteria mais quand je regarde sur le net je ne vois pas beaucoup de personne utilisant cette manière. Est-ce parce que nous n'utilisons pas la même version ou suis-je en retard sur les façon de faire ?

    Merci

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    970
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 970
    Par défaut
    "// PLANTE" = Mon PC marche plus HELP

    Blague à part, que se passe-t-il? Vous obtenez une exception, la requête ne retourne rien alors qu'elle le devrait?

  3. #3
    Membre chevronné

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 200
    Par défaut
    suis-je en retard sur les façon de faire ?
    . Au contraire, le critéria a été ajouté à JPA depuis version 2.0 et continue d'être amélioré. C'est juste que beaucoup préfère le SQL et ces dérivés JPQL, HQL, etc
    Ingénieur Recherche et Développement en informatique à Sopra

    Page perso developpez : http://armel-ndjobo.developpez.com/
    Suivez moi sur twitter : ndjobo

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 109
    Par défaut
    Effectivement j'aurais du mettre les log.

    Pour le Like le bug survient sur cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	query.where(cb.like(select.<String> get("isbn13"),
    					cb.parameter(String.class, "isbn13Searched")));
    avec ce message d'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    javax.servlet.ServletException: javax.ejb.EJBException: java.lang.IllegalArgumentException: Unable to resolve attribute [isbn13] against path
    	javax.faces.webapp.FacesServlet.service(FacesServlet.java:606)
    	org.jboss.weld.servlet.ConversationPropagationFilter.doFilter(ConversationPropagationFilter.java:62)
    Pour le Double le bug survient sur cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    query.where(cb.equal(select.<Double> get("price"),
    					cb.parameter(Double.class, "priceSearched")));
    avec ce message d'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    javax.servlet.ServletException: javax.ejb.EJBException: java.lang.IllegalArgumentException: Unable to resolve attribute [price] against path
    	javax.faces.webapp.FacesServlet.service(FacesServlet.java:606)
    	org.jboss.weld.servlet.ConversationPropagationFilter.doFilter(ConversationPropagationFilter.java:62)
    En gros c'est le même message d'erreur pour 2 choses différentes.

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    970
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 970
    Par défaut
    A priori, JPA ne retrouve pas les attributs price et isbn13 de Book. Pouvez vous nous donner le code de Book et de la table correspondante?

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 109
    Par défaut
    Merci BugFactory, mon erreur a était de prendre mes noms de colonnes à la place de mes noms de variables... erreur de jeunesse dirons nous .

    Par contre mon Like ne fonctionne pas car je ne retourne aucun enregistrement. J'ai même tenté de mettre de faire une recherche sur %001% au cas où ce serait les % qui manquent mais non je n'ai aucun résultat. Y a t'il possibilité sous éclipse de voir en mode débug les requêtes ?

    Pour mon Double, ça fonctionne à condition que je mette un point et pas une virgule. Si je mets une virgule ma méthode du bouton "recherche" ne se lance même plus. Y a t'il un moyen d'obliger l'utilisateur à mettre un point ou alors de convertir les points en virgule ? Je suis en train de chercher sur le net et je trouve des solutions pour des String mais pas pour des double.

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    970
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 970
    Par défaut
    J'ai huit ans d'expérience, et je fais toujours des erreurs de jeunesse.

    Citation Envoyé par chido Voir le message
    Pour mon Double, ça fonctionne à condition que je mette un point et pas une virgule. Si je mets une virgule ma méthode du bouton "recherche" ne se lance même plus. Y a t'il un moyen d'obliger l'utilisateur à mettre un point ou alors de convertir les points en virgule ? Je suis en train de chercher sur le net et je trouve des solutions pour des String mais pas pour des double.
    Je pense que vous faites une confusion entre les Double et leur représentation sous forme de texte. Il faut distinguer le nombre, une abstraction mathématique, et le texte, qui en est une représentation visuelle. Seul le texte a des points et des virgules, le nombre non. Par exemple, je peux écrire "1,5" ou "1 et demi", c'est le même nombre, mais représenté par des textes différents. Vous noterez que la deuxième version n'a pas de virgule alors qu'elle représente un nombre avec une partie fractionnaire.

    La classe Double correspond à l'abstraction mathématique, String, à un texte. C'est pour cela que tous les exemples que vous trouvez concernent des String.

    Quand à votre méthode, elle prend en entrée un Double. A ce stade, les points et les virgules ont déjà été lu et interprétés. Quel que soit votre problème, il ne se trouve pas dans cette méthode, mais en amont, quand le texte saisi par l'utilisateur est converti en Double.

    Citation Envoyé par chido Voir le message
    Y a t'il possibilité sous éclipse de voir en mode débug les requêtes ?
    Google à la rescousse :
    https://www.google.fr/search?q=hiber...C-bH0QXBuoGoDg
    et la première réponse est :
    http://stackoverflow.com/questions/2...-show-real-sql

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 109
    Par défaut
    Je t'avoue ne pas être à l'aise avec l'anglais et les recherches dans cette langue mais je vais réussir à m'en sortir je ne suis pas non plus trop nul ^^. Merci pour le lien !

    Pour le Double j'ai cherché un peu ce qui pourrait causer ce "problème" mais vraiment je ne vois pas. Merci pour ton "cours" sur les interprétations, j'ai appris une chose de plus !

    Et pour le Like je recherche des exemples sur le net mais je ne trouve pas sous la même forme que moi grrrr !!

  9. #9
    Membre chevronné

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 200
    Par défaut
    Bonsoir, est-ce-qu'il est possible de reposer ton problème en présentant uniquement les requêtes qui ne fonctionnent pas et en donnant la structure des entité qui sont impliquées ?
    Ingénieur Recherche et Développement en informatique à Sopra

    Page perso developpez : http://armel-ndjobo.developpez.com/
    Suivez moi sur twitter : ndjobo

  10. #10
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    970
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 970
    Par défaut
    En gros il faut mettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <property name="show_sql">true</property>
    <property name="format_sql">true</property>
    <property name="use_sql_comments">true</property>
    dans hibernate.cfg.xml.

    Ensuite je vous conseille de faire un System.out.println("price " + price); au début de vitre méthode.

    Quand au like, je ne vois pas, je pense comme naf87 qu'il nous faut plus d'informations.

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 109
    Par défaut
    naf87 => Je ne comprends pas ce que tu veux

    BugFactory => Je n'ai pas de fichier hibernate.cfg.xml

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 109
    Par défaut
    C'est pire que je le pensais pour mon critéria. Avec le code précédent, si je fais une recherche uniquement avec le titre ça fonctionne, si je fais une recherche uniquement avec le prix sa fonctionne et si je fais une recherche avec l'editeur ça fonctionne également.

    Par contre, à partir du moment ou je recherche avec 2 critères, j'ai une erreur au premier typedQuery.setParameter(XXX) sur lequel il passe avec ce genre de message :

    Si je fais une recherche sur le prix et l'éditeur, il passe d’abord dans le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedQuery.setParameter("editorSearched", editor);
    donc j'ai ce message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    javax.servlet.ServletException: javax.ejb.EJBException: java.lang.IllegalArgumentException: Named parameter [editorSearched] not encountered
    ou encore

    Si je fais une recherche sur le titre et l'éditeur, il passe d’abord dans le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedQuery.setParameter("titleSearched", title);
    donc j'ai ce message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    javax.servlet.ServletException: javax.ejb.EJBException: java.lang.IllegalArgumentException: Named parameter [titleSearched] not encountered

  13. #13
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    970
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 970
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedQuery.setParameter("isbn13Searched", "*" + isbn13 + "*");
    Avez vous essayé sans les "*" ?

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 109
    Par défaut
    Pour ce problème j'ai trouvé la solution à l'instant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedQuery.setParameter("titleSearched", "%" +  title + "%");
    Je pensais déjà avoir essayé cette solution mais bref !

    Par contre j'ai toujours le même problème dès que je fais une recherche avec plusieurs critères alors qu'ici c'est le but :-(

  15. #15
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 109
    Par défaut
    Trouvé ! Je ne sais pas d'où venais l'erreur mais j'ai changé ma façon de faire et j'ai trouvé une solution qui fonctionne parfaitement :

    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
    30
    31
    32
    33
    public List<Book> getBooksByMultiCriteria(String title, Integer authorId,
    			String editor, String isbn13, Double price) throws Exception {
     
    		CriteriaBuilder qb = em.getCriteriaBuilder();
    		CriteriaQuery<Book> cq = qb.createQuery(Book.class);
    		Root<Book> customer = cq.from(Book.class);
     
    		List<Predicate> predicates = new ArrayList<Predicate>();
     
    		if (title != null && title != "") {
    			predicates.add(qb.like(customer.<String> get("title"), "%" + title
    					+ "%"));
    		}
    		if (isbn13 != null && isbn13 != "") {
    			predicates.add(qb.equal(customer.get("isbn"), isbn13));
    		}
    		if (authorId != null && authorId != 0) {
    			predicates.add(qb.equal(customer.<Integer> get("author").get("id"),
    					authorId));
    		}
    		if (editor != null && editor != "") {
    			predicates.add(qb.equal(customer.get("editor"), editor));
    		}
    		if (price != null && price != 0.0) {
    			predicates.add(qb.lessThanOrEqualTo(
    					customer.<Double> get("unitPrice"), price));
    		}
     
    		cq.select(customer).where(predicates.toArray(new Predicate[] {}));
     
    		return em.createQuery(cq).getResultList();
     
    	}
    J'espère que ça en aidera d'autres

  16. #16
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    970
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 970
    Par défaut
    Cette façon de faire risque de vous faire une surprise si un utilisateur facétieux met comme titre de recherche
    dans le formulaire. C'est une injection SQL et c'est très, très connu et donc très, très utilisé.

  17. #17
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 109
    Par défaut
    Cette appli n'est pas pour être utiliser en production mais merci de me l'indiquer je le sais maintennet . L'autre méthode ne fonctionne pas et il n'y a pas de "point" sur la sécurité mais uniquement sur le fonctionnement .

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Criteria] Double relation @ManytoMany pas récupéré avec criteria
    Par amaury972 dans le forum Hibernate
    Réponses: 0
    Dernier message: 27/09/2011, 10h08
  2. api Criteria Jointure avec Double restriction
    Par lunatix dans le forum Hibernate
    Réponses: 4
    Dernier message: 21/04/2011, 17h20
  3. Criteria et like
    Par *alexandre* dans le forum Hibernate
    Réponses: 1
    Dernier message: 16/09/2008, 09h41
  4. Réponses: 3
    Dernier message: 12/06/2002, 21h15
  5. Créer un interpréteur de langage inspiré du Basic
    Par Picasso dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 11/05/2002, 17h10

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