Brak metody CrudRepository # findOne


101

W moim projekcie używam Spring 5. Do dziś była dostępna metoda CrudRepository#findOne.

Ale po pobraniu najnowszej migawki nagle zniknął! Czy jest jakaś wzmianka, że ​​metoda nie jest obecnie dostępna?

Moja lista zależności:

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'
}

AKTUALIZACJA:

Wygląda na to, że ta metoda została zastąpiona CrudRepository#findById

Odpowiedzi:


150

Zobacz DATACMNS-944, który jest powiązany z tym zatwierdzeniem, który ma następujące zmiany

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

1
Czy istnieje przewodnik po migracji, który przegapiłem, czy też ten niejasny wiersz z informacji o wersji dotyczy wszystkich ogłoszeń? „DATAJPA-1104 - Dostosuj się do zmian API w interfejsach repozytorium” Jak się dowiedziałeś? :-)
Christian

2
Nie jestem pewien, czy to jest jakikolwiek przewodnik dotyczący migracji, ale możesz znaleźć odniesienie do niego w wiki Kay release train ( github.com/spring-projects/spring-data-commons/wiki/… ), a także w dzienniku zmian Spring Data Commons ( dokumentacja .spring.io / spring-data / commons / docs / current / changelog.txt )
Sean Carroll

104

Zauważ, że findByIdnie jest to dokładny zamiennik dla findOne, zwraca Optionalzamiast null.

Ponieważ niezbyt dobrze poznałem nowe rzeczy w Javie, zajęło mi trochę czasu, zanim zrozumiałem, ale to zmienia findByIdzachowanie w findOnejedno:

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

1
Nie jest to najlepszy pomysł: Twój kod będzie nadal działał, ale nie używasz interfejsu API tak, jak powinieneś . Optionalzostał dodany, aby wyczyścić kod ze wszystkich nullkontroli. Po prostu zmień typ zwracanej metody i używaj go Optionaltak, jak powinien
GabiM

5
@GabiM Byłoby wspaniale, gdybyś miał kontrolę nad wszystkimi metodami. Nawet jeśli masz kontrolę nad wszystkim podrzędnym, a projekt nie jest zależny od jakiegoś innego projektu strony trzeciej, jeśli metody poniżej kodu dla null (jak w, create if not exist, lub wykonują jakąś logikę, jeśli brakuje), to masz aby je również naprawić.
zeusalmighty

Nawiązując do linku z @GabiM, chciałem tylko zaznaczyć, że nawet ten link mówi: „Ważne jest, aby zauważyć, że celem klasy Optional nie jest zastępowanie każdego pojedynczego odniesienia zerowego”
Scott Carlson,

32

Mieliśmy setki zastosowań starej findOne()metody. Zamiast zająć się gigantycznym refaktorem, w końcu utworzyliśmy następujący interfejs pośredni i kazaliśmy naszym repozytoriom rozszerzyć go zamiast rozszerzać JpaRepositorybezpośrednio

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

Najlepsze rozwiązanie dla mnie. Nie ma potrzeby odlewania. return findById(id).orElse(null);wystarczy
Ken007

Kompletnie się zgadzam. Zaoszczędził mi setki linii zmian.
Scott Carlson

7

Pragmatyczna transformacja

Stara droga:

Entity aThing = repository.findOne(1L);

Nowy sposób:

Optional<Entity> aThing = repository.findById(1L);
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.