Paramètre optionnel dans la méthode de requête

je veux écrire quelques méthodes de requête dans la couche de dépôt. Cette méthode doit ignorer les paramètres nuls. Par exemple:

List<Foo> findByBarAndGoo(Bar barParam, @optional Goo gooParam);

cette méthode doit être rendue Foo par cette condition:

bar == barParam && goo == gooParam;

si gooParam n'est pas null. si gooParam est nulle alors la condition du changement:

bar == barParam;

Est-il une solution? Quelqu'un peut-il m'aider?

22
demandé sur Neil Stockton 2015-09-23 02:47:10

4 réponses

Trop tard pour répondre. Pas sûr au sujet de la relation entre Bar et Goo. Vérifier si Exemple pouvez-vous aide.

Il a travaillé pour moi. J'ai une situation similaire, l'entité Utilisateur avez-ensemble d'attributs et n'est findAll méthode qui recherche l'utilisateur en fonction des attributs(qui sont optionnels).

Exemple

  Class User{
    String firstName;
    String lastName;
    String id;
  }

  Class UserService{
     // All are optional
     List<User> findBy(String firstName, String lastName, String id){
        User u = new User();
        u.setFirstName(firstName);
        u.setLastName(lastName);
        u.setId(id);

        userRepository.findAll(Example.of(user));
        // userRepository is a JpaRepository class
     }
  }
1
répondu Shaunak Patel 2018-06-11 07:12:59

Je ne crois pas que vous serez en mesure de faire cela avec l'approche de nom de méthode à la définition de requête. À partir de la documentation (référence):

bien que recevoir une requête dérivée du nom de la méthode soit assez pratique, on peut faire face à la situation dans laquelle soit la méthode l'analyseur de nom ne supporte pas le mot-clé que l'on veut utiliser ou la méthode nom se inutilement laid. Ainsi, vous pouvez soit utiliser JPA nommé requêtes à l'aide d'un convention de nommage (voir Utiliser JPA NamedQueries pour plus d'informations) ou plutôt annoter votre méthode de requête avec @Query

je pense que vous avez la situation ici, donc la réponse ci-dessous utilise l' @Requête annotation approche, qui est presque aussi facile que le nom de la méthode d'approche (référence).

    @Query("select foo from Foo foo where foo.bar = :bar and "
        + "(:goo is null or foo.goo = :goo)")
    public List<Foo> findByBarAndOptionalGoo(
        @Param("bar") Bar bar, 
        @Param("goo") Goo goo);
13
répondu chaserb 2016-08-30 15:46:06

en complément de la réponse de @chaserb, je voudrais personnellement ajouter le paramètre comme un type optionnel Java8 pour le rendre explicite dans la signature de la méthode la sémantique qui est un filtre optionnel.

@Query("select foo from Foo foo where foo.bar = :bar and "
   + "(:goo is null or foo.goo = :goo)")
public List<Foo> findByBarAndOptionalGoo(
     @Param("bar") Bar bar, 
     @Param("goo") Optional<Goo> goo);
3
répondu Vitor Reis 2018-05-22 15:06:18

Vous pouvez coder vous-même en quelques lignes:

List<Foo> findByBarAndOptionalGoo(Bar bar, Goo goo) {
   return (goo == null) ? this.findByBar(bar) : this.findByBarAndGoo(bar, goo);
}

sinon, je ne sais pas si Spring-Data supporte cela.

0
répondu user152468 2015-09-23 18:06:00