который показал мне способ сделать функцию более краткой.

у приложение 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
 CorayThan26 дек. 2018 г., 05:24
@ SébastienDeleuze Конечно, вещь! Определенно удобнее, чем писать самому.
 Sébastien Deleuze24 дек. 2018 г., 10:10
Согласитесь ли вы изменить лучший ответ на мой, поскольку у нас теперь есть официальная поддержка того, что вы просили весной?

Ответы на вопрос(2)

Решение Вопроса

CrudRepository.findByIdOrNull(id: ID): T? = findById(id).orElse(null) Расширение Kotlin теперь предоставляет готовый способ извлечения обнуляемых объектов в Spring Data.

Если по соображениям производительности вы хотели бы избежать использованияOptional<T> обертка, имейте в виду, что у вас также есть возможность создать пользовательский интерфейс сfindFooById(id: ID): T? функция. Выполнение запроса зависит от магазина, но большинство использует внутренние значения, которые можно обнулять, и это позволит избежать затрат наOptional<T> обертка. Обратите внимание, что эти издержки должны быть незначительными для большинства случаев использования, поэтому рекомендуется использовать встроенное расширение.

ВидетьDATACMNS-1346 Больше подробностей.

Обновление 12/2018:

Предстоящее изменение в среде Spring Data сделает этот ответ устаревшим. Обновление в основном делает то же самое, что и этот ответ: определить соответствующую функцию расширения. Посмотри пожалуйстаСебастьян Делез ответ для дальнейших деталей.

Оригинальный ответ:

Как вы правильно сказали, вам не нужноOptional в Kotlin, потому что обработка обнуляемости в сжатой форме - это встроенная функция языка.

Вы можете создать свою собственную функцию расширения для достижения желаемого поведения:

fun <T, ID> CrudRepository<T, ID>.findOne(id: ID): T? = findById(id).orElse(null)

и используйте это так:

val fruit: Fruit? = fruitRepository.findOne(id)

БлагодаряGiordano который показал мне способ сделать функцию более краткой.

Ваш ответ на вопрос