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 :

HQL: Retourner 0 lorsque le résultat est vide


Sujet :

JPA Java

  1. #1
    Membre actif
    Inscrit en
    Juin 2005
    Messages
    578
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 578
    Points : 240
    Points
    240
    Par défaut HQL: Retourner 0 lorsque le résultat est vide
    Bonjour

    J'ai une requête HQL qui retourne l'identifiant d'un client à partir de son nom:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    @Query("SELECT COALESCE(a.idClient,0) from Client a WHERE a.nomClient = :nomClient")
    	long findIdClientByNomClient(@Param("nomClient") String nomClient);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    @RequestMapping(value="/entrepot", method=RequestMethod.POST)
    	public void getAllMagasinage(ModelMap model, @RequestParam(name = "nomClientRecherche") String nomClient, HttpServletResponse response) throws ServletException, IOException {
     
    	long  idClient = clientService.findIdClientByNomClient(nomClient);
    Sauf que quand le nom du client n'existe pas, j'aimerai retourner 0 comme identifiant. Pour ça, j'ai utilisé la fonction COALESCE mais je reçois un message d'erreur lorsque le nom du client n'existe pas:

    Null return value from advice does not match primitive return type for: public abstract long com.nitraentrepot.repository.ClientRepository.findIdClientByNomClient(java.lang.String)
    ça me retourne une valeur null au lieu de 0, et comme le type long n'accepte pas de valeur null, j'ai ce message d'erreur.

    Donc comment retourner 0 lorsque le résultat est null.

    Merci

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    940
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 940
    Points : 1 817
    Points
    1 817
    Par défaut
    Bonjour,

    Tout d'abord coalesce ne vous aidera pas ici. Si a.idClient était null, il le transformerait en 0. Mais ce n'est pas le problème : si aucun client n'est trouvé la requête retourne zéro ligne, et il n'y a aucun idClient sur lequel coalesce pourrait être exécuté!

    La meilleure solution serait de remplacer long par Long (ou Optional<Long>) et de tester les null. Null est censé représenter les valeurs manquantes, utiliser 0 est une "valeur magique" et c'est toujours une source de problèmes plus tard.

    Si vous tenez absolument à utiliser 0 pour les résultats de recherche vides, le plus simple est d'utiliser les méthodes par défaut des interfaces.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    @Query("SELECT COALESCE(a.idClient,0) from Client a WHERE a.nomClient = :nomClient")
    	Long findIdClientByNomClientNullEmpty(@Param("nomClient") String nomClient);
     
            default long findIdClientByNomClientZeroEmpty(String nomClient) {
                    Long idClient = findIdClientByNomClientNullEmpty(nomClient);
                    return idClient == null ? 0L : idClient.longValue();
            }
    Mais encore une fois, en Java on utilise null (ou Optional) pour les valeurs vides, ce code à rallonge n'est que le début de vos ennuis si vous persistez.

  3. #3
    Membre éclairé

    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    453
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 453
    Points : 883
    Points
    883
    Billets dans le blog
    5
    Par défaut
    Très franchement, je suis entièrement d'accord avec le commentaire au dessus, à savoir utiliser un Long plutôt qu'un long, et si ça n'existe pas, retourner un null.

    Dans la pratique, c'est comme ça que l'on fait.

    Remarque à part: nomClient n'est pas forcement unique, ce qui implique que idClient n'est pas forcement unique si on a 2 dupond dans laBDD.

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    940
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 940
    Points : 1 817
    Points
    1 817
    Par défaut
    Bonne remarque, mieux vaut retourner une liste au cas où deux personnes auraient le même nom.

  5. #5
    Membre actif
    Inscrit en
    Juin 2005
    Messages
    578
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 578
    Points : 240
    Points
    240
    Par défaut
    Merci beaucoup, j'ai compris.

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

Discussions similaires

  1. Détruire une session lorsque le caddie est vide.
    Par Niki59 dans le forum Langage
    Réponses: 2
    Dernier message: 22/10/2008, 22h46
  2. Réponses: 15
    Dernier message: 07/10/2008, 18h41
  3. Que renvoie Access lorsqu'un champ est vide?
    Par jamesleouf dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 21/05/2008, 15h28
  4. [CKEditor] Code inutile (et gênant) généré lorsque le texte est vide sous Firefox
    Par Hervé Saladin dans le forum Bibliothèques & Frameworks
    Réponses: 3
    Dernier message: 05/05/2008, 12h02
  5. Comment afficher les lignes lorsque la valeur est vide ?
    Par matimat2k4 dans le forum Langage SQL
    Réponses: 24
    Dernier message: 02/04/2008, 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