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?
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
}
}
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);
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);
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.