Я пишу приложение Spring Boot с Spring Data JPA и Kotlin, и я заметил, что в CrudRepository
существует следующий метод:
Optional<T> findById(ID id);
Тем не менее, я использую Kotlin, который имеет гораздо более плавные способы работы с нулями, чем Optional
. Кто-нибудь знает, как я буду конвертировать этот метод, чтобы работать так?
fun findById(id: ID): T?
Когда я расширяю Repository
и создаю репо с этой сигнатурой, я получаю ошибку:
java.lang.ClassCastException: java.util.Optional cannot be cast to com.books.Book
Вы должны использовать интерфейс JpaRepository
:
Создать репозиторий:
interface FruitRepository : JpaRepository<Fruit, Long> { }
Использование:
val fruit: Fruit? = fruitRepository.getOne(id)
Предположим, вы все CrudRepository
хотите использовать CrudRepository
с функцией findById
, тогда вы можете создать свою собственную функцию расширения следующим образом:
fun <T> CrudRepository<T, Long>.findOne(id: Long): T? { val o = findById(id) return if(o.isPresent) o.get() else null }
и используйте его так:
val fruit: Fruit? = fruitRepository.findOne(id)