스프링 데이터 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
'programing' 카테고리의 다른 글
| gem install json -v 1.7.3은 '빌드 도구를 포함하도록 PATH를 업데이트하십시오'를 제공합니다. (0) | 2023.02.22 |
|---|---|
| 메이븐...프로젝트를 정리하지 못했습니다.삭제하지 못했습니다.\sysm.ow2.sysm-asm-tree-3.1.jar (0) | 2023.02.22 |
| JQuery를 사용하여 데이터를 레일에 배치하려면 어떻게 해야 합니까? (0) | 2023.02.22 |
| Angular에서 속성 액세스JS 지시어 (0) | 2023.02.22 |
| watch 플러그인 "node_modules/jest-watch-typeahead/filename.js"를 초기화하지 못했습니다. (0) | 2023.02.22 |