3 votes

Comment interroger correctement les entités dans Spring JPA avec Kotlin ?

Je suis en train de migrer mon application vers la dernière version de Spring Data et j'ai du mal à le faire correctement.

Imaginons que j'ai un référentiel avec une seule méthode, afin d'interroger en plus mes entités par nom :

@Repository
interface FooRepository : JpaRepository<Foo, Long> {
   fun findByName(name: String): Foo
}

D'après la documentation, dans une telle situation - si l'entité n'est pas trouvée - un message d'erreur est envoyé à l'utilisateur. EmptyResultDataAccessException seront lancés.

Cependant, je veux aussi pouvoir interroger les entités par leur identifiant. Si j'utilise findById le résultat sera Optional<Foo> . Une autre option consiste à utiliser getOne ce qui, d'autre part, se traduira par EntityNotFoundException si elle n'est pas trouvée.

Alors, y a-t-il un autre moyen que de tout déplacer vers Optional , pour avoir une API uniforme en Kotlin ?

2voto

Cepr0 Points 7789

Vous devez utiliser point d'interrogation avec le type retourné de votre méthode d'interrogation comme "équivalent" à En option :

interface FooRepository : JpaRepository<Foo, Long> {
   fun findByName(name: String): Foo?
}

Ensuite, vous pouvez utiliser votre méthode avec elvis-opérateur :

val foo = repo.findByName("bar") ?: Foo("bar")
repo.findByName("bar") ?: throw IllegalArgumentException("foo not found")

Plus d'informations : Les équivalents de l'API java.util.Optional de Kotlin

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X