Fehlende CrudRepository # findOne-Methode

100

Ich verwende Spring 5 in meinem Projekt. Bis heute gab es eine verfügbare Methode CrudRepository#findOne.

Aber nach dem Herunterladen des neuesten Schnappschusses verschwand er plötzlich! Gibt es einen Hinweis darauf, dass die Methode derzeit nicht verfügbar ist?

Meine Abhängigkeitsliste:

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

AKTUALISIEREN:

Scheint, dass diese Methode durch ersetzt wurde CrudRepository#findById

Andrii Abramov
quelle

Antworten:

149

Weitere Informationen finden Sie unter DATACMNS-944, das diesem Commit zugeordnet ist und die folgenden Umbenennungen aufweist

╔═════════════════════╦═══════════════════════╗
║      Old name       ║       New name        ║
╠═════════════════════╬═══════════════════════╣
║ findOne(…)          ║ findById(…)           ║
╠═════════════════════╬═══════════════════════╣
║ save(Iterable)      ║ saveAll(Iterable)     ║
╠═════════════════════╬═══════════════════════╣
║ findAll(Iterable)   ║ findAllById(…)        ║
╠═════════════════════╬═══════════════════════╣
║ delete(ID)          ║ deleteById(ID)        ║
╠═════════════════════╬═══════════════════════╣
║ delete(Iterable)    ║ deleteAll(Iterable)   ║
╠═════════════════════╬═══════════════════════╣
║ exists()            ║ existsById(…)         ║
╚═════════════════════╩═══════════════════════╝
Sean Carroll
quelle
1
Gibt es einen Migrationsleitfaden, den ich verpasst habe, oder ist diese vage Zeile aus den Versionshinweisen alles in Bezug auf Ankündigungen, die es gab? "DATAJPA-1104 - Anpassung an API-Änderungen in Repository-Schnittstellen" Wie haben Sie das herausgefunden? :-)
Christian
2
Ich bin mir nicht sicher, ob dies ein Migrationshandbuch ist, aber Sie finden einen Verweis darauf im Kay Release Train-Wiki ( github.com/spring-projects/spring-data-commons/wiki/… ) sowie im Spring Data Commons-Änderungsprotokoll ( Dokumente) .spring.io / spring-data / commons / docs / current / changelog.txt )
Sean Carroll
103

Beachten Sie, dass dies findByIdkein exakter Ersatz für ist findOne, sondern ein Optionalstatt zurückgibt null.

Da ich mit neuen Java-Dingen nicht sehr vertraut war, brauchte ich eine Weile, um das herauszufinden, aber dies macht das findByIdVerhalten zu findOneeinem:

return rep.findById(id).orElse(null);
Tinus Tate
quelle
1
Nicht die beste Idee: Ihr Code funktioniert weiterhin, aber Sie verwenden die API nicht wie gewünscht . Optionalwurde hinzugefügt, um den Code von allen nullÜberprüfungen zu reinigen . Ändern Sie einfach den Rückgabetyp Ihrer Methode und verwenden Sie ihn Optionalwie ein guter Pfadfinder
GabiM
5
@GabiM Dies wäre großartig, wenn Sie die Kontrolle über alle nachgeschalteten Methoden hätten. Selbst wenn Sie die Kontrolle über alles Downstream haben und Ihr Projekt keine Abhängigkeit für ein anderes Drittanbieterprojekt darstellt, haben Sie die Methoden Downstream-Code für null (wie in, erstellen, wenn nicht vorhanden, oder machen Sie eine Logik, wenn sie fehlt), dann haben Sie um sie auch zu reparieren.
zeusalmighty
In Bezug auf den Link von @GabiM wollte ich nur darauf hinweisen, dass selbst dieser Link sagt: "Es ist wichtig zu beachten, dass die Absicht der optionalen Klasse nicht darin besteht, jede einzelne Nullreferenz zu ersetzen"
Scott Carlson
32

Wir hatten viele hundert Anwendungen der alten findOne()Methode. Anstatt uns auf einen Mammut-Refaktor einzulassen, haben wir am Ende die folgende Zwischenschnittstelle erstellt und von unseren Repositories erweitern lassen, anstatt sie JpaRepositorydirekt zu erweitern

@NoRepositoryBean
public interface BaseJpaRepository<T, ID> extends JpaRepository<T, ID> { 
    default T findOne(ID id) { 
        return (T) findById(id).orElse(null); 
    } 
} 
ashario
quelle
Top Lösung für mich. Kein Casting nötig. return findById(id).orElse(null);genügt
Ken007
Stimme voll und ganz zu. Hat mir Hunderte von Änderungszeilen erspart.
Scott Carlson
7

Eine pragmatische Transformation

Alter Weg:

Entity aThing = repository.findOne(1L);

Neuer Weg:

Optional<Entity> aThing = repository.findById(1L);
Mach Nhu Vy
quelle