Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Spring] Petite requête

Sujet résolu
    29 novembre 2020 à 0:12:36

    Bonjour,

    j'ai un petit souci pour écrire une requête avec un LIKE pour faire une recherche en base avec Spring.

    @Query("SELECT a FROM Artist a WHERE lower(a.name) = lower(:name)")
        Page<Artist> findAllArtistsByName(@Param("name") String name);

    Celle fonctionne mais il faut donner le nom exacte.

    J'arrive pas à mettre le LIKE pour que ça fonctionne

    @Query("SELECT a FROM Artist a WHERE lower(a.name) LIKE '%lower(:name)%'")
        Page<Artist> findAllArtistsByName(@Param("name") String name);

    Ca ça ne fonctionne pas, mais j'arrive pas à trouver comment on met les %, j'ai essayé plein de "position" mais rien ne marche.

    Une idée svp ... ?

    • Partager sur Facebook
    • Partager sur Twitter
      29 novembre 2020 à 14:34:13

      bonjour,

      avec jpa

      @Query("SELECT a FROM Artist a WHERE lower(a.name) LIKE lower(concat('%', :name,'%'))")
          Page<Artist> findAllArtistsByName(@Param("name") String name);

      ou encore avec spring data:

       Page<Artist> findByNameContainingIgnoreCase(String name);





      • Partager sur Facebook
      • Partager sur Twitter
        29 novembre 2020 à 16:29:26

        Re, merci pour ton aide.

        Alors je voudrais bien tester, mais j'ai un souci d'affichage.

        A priori, pour ce que j'en comprends, il affiche d'office toute ma liste d'artiste, même quand j'en veux qu'un liste réduite à un nom.

        Je suis pas très à l'aise avec l'écriture des chemins mais voilà ce que j'ai :

        //Pagination liste de tous les artistes
            @RequestMapping(
                    method = RequestMethod.GET,
                    produces = MediaType.APPLICATION_JSON_VALUE,
                    params = {"page","size","sortProperty","sortDirection"}
            )
            @ResponseStatus(HttpStatus.OK)
            public Page<Artist> listPageArtists(
                    @RequestParam(defaultValue = "0") Integer page,
                    @RequestParam(defaultValue = "10") Integer size,
                    @RequestParam(defaultValue = "name") String sortProperty,
                    @RequestParam(value = "sortDirection", defaultValue = "ASC") String sortDirection
            ){
                Page<Artist> listPageArtists = artistRepository.findAll(PageRequest.of(page, size,
                        Sort.Direction.fromString(sortDirection), sortProperty));
                return listPageArtists;
            }

        qui me donne bien une url : /artists?page=0&size=10&sortProperty=name&sortDirection=ASC

        Et voilà ce que j'ai pour ma recherche par nom

        //Recherche d'un ou des artistes dans la bdd par son nom
            @RequestMapping(
                    params = {"name"},
                    method = RequestMethod.GET,
                    produces = MediaType.APPLICATION_JSON_VALUE
            )
            @ResponseStatus(HttpStatus.OK)
            public Page<Artist> searchByName(
                    @RequestParam(value = "name") String name,
                    @RequestParam(defaultValue = "0") Integer page,
                    @RequestParam(defaultValue = "10") Integer size,
                    @RequestParam(defaultValue = "name") String sortProperty,
                    @RequestParam(value = "sortDirection", defaultValue = "ASC") String sortDirection
            ){
                Pageable pageRequest = PageRequest.of(page, size, Sort.Direction.fromString(sortDirection), sortProperty);
                Page<Artist> artistsByName = artistRepository.findByNameContainingIgnoreCase(name, pageRequest);
                return artistsByName;
            }

        Malheureusement il m'affiche : /artists?name=rosmi&page=0&size=10&sortProperty=name&sortDirection=ASC

        Moi j'aurai juste voulu : /artists?name=rosmi

        De plus, il m'affiche également toute la liste des artistes et pas seulement ceux contenant rosmi dedans.

        Je veux pouvoir continuer à avoir l'affichage paginée.

        Donc mon problème se situe au niveau des paramètres. Mais comment lui faire garder la pagination mais qu'il ne recherche que par nom ?

        ==========================================================================

        Bon j'ai trouvé une solution.

        Voilà le controller

        @RequestMapping(
                    params = {"name","page","size","sortProperty","sortDirection"},
                    method = RequestMethod.GET,
                    produces = MediaType.APPLICATION_JSON_VALUE
            )
            @ResponseStatus(HttpStatus.OK)
            public Page<Artist> searchByName(
                    @RequestParam(value = "name") String nameSearch,
                    @RequestParam(defaultValue = "0") Integer page,
                    @RequestParam(defaultValue = "10") Integer size,
                    @RequestParam(defaultValue = "name") String sortProperty,
                    @RequestParam(value = "sortDirection", defaultValue = "ASC") String sortDirection
            ){
                Pageable pageRequest = PageRequest.of(page, size, Sort.Direction.fromString(sortDirection), sortProperty);
                Page<Artist> artistsByName = artistRepository.findByNameContainsIgnoreCase(nameSearch, pageRequest);
                return artistsByName;
            }
        
        
            //Pagination liste de tous les artistes
            @RequestMapping(
                    method = RequestMethod.GET,
                    produces = MediaType.APPLICATION_JSON_VALUE,
                    params = {"page","size","sortProperty","sortDirection"}
            )
            @ResponseStatus(HttpStatus.OK)
            public Page<Artist> listPageArtists(
                    @RequestParam(defaultValue = "0") Integer page,
                    @RequestParam(defaultValue = "10") Integer size,
                    @RequestParam(defaultValue = "name") String sortProperty,
                    @RequestParam(value = "sortDirection", defaultValue = "ASC") String sortDirection
            ){
                if (page<0){
                    throw new IllegalArgumentException("la page doit être positif ou null");//erreur 400
                }
                if (size<=0 || size>=50){
                    throw new IllegalArgumentException("la taille doit être compris entre 0 et 50");//erreur 400
                }
                if (!"ASC".equalsIgnoreCase(sortDirection) && !"DESC".equalsIgnoreCase(sortDirection)){
                    throw new IllegalArgumentException("Le paramètre sortDirection doit être ASC ou DESC");
                }
        
                Page<Artist> listPageArtists = artistRepository.findAll(PageRequest.of(page, size,
                        Sort.Direction.fromString(sortDirection), sortProperty));
                return listPageArtists;
            }
        

        le repository

         //Recherche paginée d'artistes par le nom sans prise en compte des majuscules
            Page<Artist> findByNameContainsIgnoreCase(String name, Pageable pageable);
        



        -
        Edité par Pitchounvivi 29 novembre 2020 à 22:35:25

        • Partager sur Facebook
        • Partager sur Twitter

        [Spring] Petite requête

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown