programing

스프링 데이터 JPA 옵션 대신 Kotlin null을 사용하는 방법

mytipbox 2023. 2. 22. 21:16
반응형

스프링 데이터 JPA 옵션 대신 Kotlin null을 사용하는 방법

Spring Data JPA와 Kotlin을 사용하여 Spring Boot 앱을 만들고 있는데, 이 앱은CrudRepository다음 방법이 있습니다.

Optional<T> findById(ID id);

하지만 코틀린을 사용하고 있어요. 코틀린은 Null을 처리하는 방법이 훨씬 더 유창해요.Optional이 방법을 이렇게 변환하는 방법을 아는 사람 있나요?

fun findById(id: ID): T?

내가 연장할 때Repository그 시그니처를 가진 레포(repo)를 작성하면 다음과 같은 오류가 발생합니다.

java.lang.ClassCastException: java.util.Optional cannot be cast to com.books.Book

Spring Data Lovelace SR4 / Spring Boot 2.1.2에서는CrudRepository.findByIdOrNull(id: ID): T? = findById(id).orElse(null)이제 Kotlin 확장 기능을 통해 스프링 데이터에서 늘 엔티티를 검색할 수 있습니다.

퍼포먼스상의 이유로, 의 사용을 피하고 싶은 경우.Optional<T>wrapper에는 커스텀인터페이스를 작성할 수도 있습니다.findFooById(id: ID): T?기능.쿼리 실행은 스토어에 따라 다르지만 대부분은 내부적으로 늘 수 있는 값을 사용하고 있기 때문에 비용이 들지 않습니다.Optional<T>랩퍼대부분의 경우 이 오버헤드는 무시할 수 있으므로 내장된 확장 기능을 사용하는 것이 좋습니다.

상세한 것에 대하여는, 「DATACMNS-1346」을 참조해 주세요.

업데이트 12/2018:

Spring Data 프레임워크가 변경되면 이 답변은 더 이상 사용되지 않게 됩니다.업데이트는 기본적으로 다음 답변과 동일합니다. 즉, 적절한 확장 함수를 정의합니다.자세한 내용은 세바스티앙 들뢰즈의 답변을 참조하십시오.

원답:

당신이 정확히 말한 것처럼, 당신은 필요 없다.OptionalKotlin에서는 간결하게 무효를 처리하는 것이 언어 기능이기 때문입니다.

원하는 동작을 실현하기 위해 자체 확장 함수를 만들 수 있습니다.

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

다음과 같이 사용합니다.

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

기능을 보다 간결하게 하는 방법을 가르쳐 준 Giordano씨 덕분입니다.

Sébastien Dleuze의 답변의 짧은 버전: null return type으로 함수를 정의하기만 하면 됩니다.

interface UserRepository : Repository<User, String> {

  // throws EmptyResultDataAccessException, if no user is found
  fun findByUsername(username: String): User     

  // return null, if no user is found
  fun findByFirstname(firstname: String?): User? 
}

스프링 데이터 참조 문서를 참조하십시오.

언급URL : https://stackoverflow.com/questions/47143127/spring-data-jpa-how-to-use-kotlin-nulls-instead-of-optional

반응형