Tout ce que je sais à ce jour, c’est que FindBy peut renvoyer plusieurs résultats tandis que FindOneBy renverra un seul résultat ou sera nul lorsque nous l’utiliserons de la manière suivante.
List<Department> findByDepartmentName(String name);
Department findOneByDepartmentId(Long Id);
ma question est la suivante: puis-je utiliser findBy de cette façon?
Department findByDepartmentId(Long Id);
Si oui,
Enfin, quand ou pourquoi ne devrais-je pas utiliser findBy à la place de findOneBy?
Puis-je utiliser
findBy
de cette façon? DépartementfindByDepartmentId(Long Id)
;
Oui, cette syntaxe est techniquement correcte du point de vue de Spring JPA. Bien que Spring JPA déduise ce que vous essayez d’obtenir avec votre requête, examinez également le type return.
En gros, ce sont les cas pour les types de retour:
avec votre requête, vous voulez renvoyer une valeur unique - vous pouvez spécifier basic type
, Entity T
, Optional<T>
, CompletableFuture<T>
etc.
avec votre requête, vous souhaitez renvoyer une collection de T - vous pouvez spécifier List<T>
, Stream<T>
, Page<T>
, Slice<T>
etc.
Cela étant dit, votre définition de requête:
Department findByDepartmentId(Long Id);
signifie que vous attendez un seul résultat (car vous avez spécifié une seule entité comme type de retour). Cela va refléter la manière dont Spring JPA exécute la requête - il appellera getSingleResult()
sur l'interface javax.persistence.Query
, ce qui lancera une exception
si plusieurs objets répondent aux critères.
Sur quelle base
findBydepartmentId
renvoie-t-il un seul enregistrement?
Sur la base qu'il existe un seul objet avec cet ID, sinon, il lèvera une exception.
Quand ou pourquoi ne devrais-je pas utiliser
findBy
à la place defindOneBy
?
Ces deux ont des significations différentes et ne sont pas interchangeables.
findOneBy
a toujours pour résultat que getSingleResult()
est invoqué.
findBy
a un comportement différent en fonction du type de retour - conformément aux définitions données ci-dessus.
findOneByXX
s'assurera qu'il n'y a qu'une ou aucune valeur, s'il y a 2 valeurs, une exception sera levée.
Cependant, findByXX
ne fait pas cette vérification de l'unicité.