CrudRepository # findOne 메서드 누락


101

내 프로젝트에서 Spring 5를 사용하고 있습니다. 오늘까지 사용 가능한 방법이있었습니다 CrudRepository#findOne.

하지만 최신 스냅 샷을 다운로드 한 후 갑자기 사라졌습니다! 현재이 방법을 사용할 수 없다는 언급이 있습니까?

내 의존성 목록 :

apply plugin: 'java'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'


repositories {
    mavenCentral()
    maven { url "https://repo.spring.io/snapshot" }
    maven { url "https://repo.spring.io/milestone" }
}    

dependencies {
    compile 'org.springframework.boot:spring-boot-starter-data-jpa'

    runtime 'com.h2database:h2:1.4.194'
}

최신 정보:

이 방법이 다음으로 대체 된 것 같습니다. CrudRepository#findById

답변:


150

참조하시기 바랍니다 DATACMNS-944 에 연결되어 이 커밋 다음 이름 바꾸기를 가지고있는

╔═════════════════════╦═══════════════════════╗
║      Old name       ║       New name        ║
╠═════════════════════╬═══════════════════════╣
║ findOne(…)          ║ findById(…)           ║
╠═════════════════════╬═══════════════════════╣
║ save(Iterable)      ║ saveAll(Iterable)     ║
╠═════════════════════╬═══════════════════════╣
║ findAll(Iterable)   ║ findAllById(…)        ║
╠═════════════════════╬═══════════════════════╣
║ delete(ID)          ║ deleteById(ID)        ║
╠═════════════════════╬═══════════════════════╣
║ delete(Iterable)    ║ deleteAll(Iterable)   ║
╠═════════════════════╬═══════════════════════╣
║ exists()            ║ existsById(…)         ║
╚═════════════════════╩═══════════════════════╝

1
내가 놓친 마이그레이션 가이드가 있습니까, 아니면 발표 내용과 관련하여 릴리스 노트에서 모호한 줄입니까? "DATAJPA-1104-저장소 인터페이스의 API 변경에 적응"어떻게 알게 되었습니까? :-)
Christian

2
이것이 마이그레이션 가이드인지 확실하지 않지만 Kay 릴리스 기차 위키 ( github.com/spring-projects/spring-data-commons/wiki/… )와 Spring Data Commons 변경 로그 ( docs ) 에서 참조를 찾을 수 있습니다. .spring.io / spring-data / commons / docs / current / changelog.txt )
Sean Carroll

104

findById에 대한 정확한 대체하지 않습니다는 findOne, 그것은 반환 Optional대신에 null.

새로운 자바에 익숙하지 않아서 알아내는 데 약간의 시간이 걸렸지 만 이것은 findById동작을 findOne하나로 바꿉니다 .

return rep.findById(id).orElse(null);

1
최선의 방법은 아닙니다. 코드는 계속 작동하지만 API 정상적으로 사용하고 있지는 않습니다 . Optional모든 null검사 에서 코드를 정리하기 위해 추가되었습니다 . 그냥 반환하면 방법의 종류와 사용 변경 Optional과 같은 좋은 소년 - 스카우트를해야
GabiM

5
@GabiM 다운 스트림의 모든 메소드를 제어 할 수 있다면 좋을 것입니다. 모든 다운 스트림을 제어 할 수 있고 프로젝트가 다른 타사 프로젝트에 대한 종속성이 아니더라도 메서드가 null에 대한 다운 스트림 코드 (존재하지 않는 경우 생성 또는 누락 된 경우 일부 논리 수행) 인 경우 그들을 고칠 수도 있습니다.
zeusalmighty

@GabiM의 링크와 관련하여, 그 링크조차도 "Optional 클래스의 의도가 모든 단일 null 참조를 대체하는 것이 아니라는 점에 유의하는 것이 중요합니다."라는 점을 지적하고 싶었습니다
Scott Carlson

32

우리는 이전 findOne()방법을 수백 번 사용했습니다 . 거대한 리팩터링을 시작하는 대신 다음과 같은 중개 인터페이스를 만들고 리포지토리에서 JpaRepository직접 확장하는 대신 확장하도록했습니다.

@NoRepositoryBean
public interface BaseJpaRepository<T, ID> extends JpaRepository<T, ID> { 
    default T findOne(ID id) { 
        return (T) findById(id).orElse(null); 
    } 
} 

나를위한 최고의 솔루션. 캐스팅 할 필요가 없습니다. return findById(id).orElse(null);충분
Ken007

전적으로 동의합니다. 수백 줄의 변경 사항을 저장했습니다.
Scott Carlson

7

실용적인 변화

이전 방식 :

Entity aThing = repository.findOne(1L);

새로운 길:

Optional<Entity> aThing = repository.findById(1L);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.