Как правильно запрашивать объекты в Spring JPA с Kotlin - PullRequest
0 голосов
/ 26 июня 2018

Я перевожу свое приложение на последние версии Spring Data и изо всех сил стараюсь сделать это правильно.

Представьте, что у меня есть хранилище с одним методом, чтобы дополнительно запрашивать мои объекты по имени:

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

Согласно документам, в такой ситуации - если сущность не найдена - будет выброшено EmptyResultDataAccessException.

Однако я также хочу иметь возможность запрашивать сущности по id. Если я использую findById, результат будет Optional<Foo>. Другой вариант - использовать getOne, что, с другой стороны, приведет к EntityNotFoundException, если не найден.

Итак, есть ли другой способ, кроме как перевести все на Optional, чтобы получить единый API в Kotlin?

1 Ответ

0 голосов
/ 26 июня 2018

Вы должны использовать знак вопроса с возвращенным типом вашего метода запроса в качестве «эквивалента» Необязательно :

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

Тогда вы можете использовать свой метод с elvis-operator :

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

Дополнительная информация: java.util от Kotlin. Дополнительные эквиваленты API

...