Metodo CrudRepository # findOne mancante


101

Sto usando Spring 5 nel mio progetto. Fino ad oggi era disponibile il metodo CrudRepository#findOne.

Ma dopo aver scaricato l'ultima istantanea è improvvisamente scomparsa! C'è qualche riferimento che il metodo non è disponibile ora?

Il mio elenco di dipendenze:

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

AGGIORNARE:

Sembra che questo metodo sia stato sostituito con CrudRepository#findById

Risposte:


150

Vedere DATACMNS-944 associato a questo commit che ha le seguenti ridenominazioni

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

1
C'è una guida alla migrazione che mi sono persa o questa riga vaga dalle note di rilascio è tutta in termini di annunci? "DATAJPA-1104 - Adattarsi alle modifiche API nelle interfacce del repository" Come l'hai scoperto? :-)
Christian

2
Non sono sicuro che questa sia una guida alla migrazione, ma puoi trovare riferimenti ad essa nel wiki del treno di rilascio di Kay ( github.com/spring-projects/spring-data-commons/wiki/… ) così come il changelog di Spring Data Commons ( docs .spring.io / spring-data / commons / docs / current / changelog.txt )
Sean Carroll

104

Nota che findByIdnon è una sostituzione esatta di findOne, restituisce un Optionalinvece di null.

Non avendo molta familiarità con le nuove cose java mi ci è voluto un po 'per capirlo, ma questo trasforma il findByIdcomportamento in findOnequello:

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

1
Non è l'idea migliore: il tuo codice continuerà a funzionare ma non stai utilizzando l'API come dovresti . Optionalè stato aggiunto per pulire il codice da tutti i nullcontrolli. Basta cambiare il tipo di ritorno del tuo metodo e usarlo Optionalcome un bravo boy-scout dovrebbe
GabiM

5
@GabiM Sarebbe fantastico se avessi il controllo di tutti i metodi a valle. Anche se hai il controllo di tutto a valle e il tuo progetto non è una dipendenza per qualche altro progetto di terze parti, se i metodi a valle codificano per null (come in, crea se non esiste, o fai un po 'di logica se manca), allora hai per risolverli anche.
zeusalmighty

In riferimento al collegamento da @GabiM, volevo solo sottolineare che anche quel collegamento dice "È importante notare che l'intenzione della classe Optional non è quella di sostituire ogni singolo riferimento nullo"
Scott Carlson

32

Avevamo molte centinaia di utilizzi del vecchio findOne()metodo. Piuttosto che intraprendere un gigantesco refactor, abbiamo finito per creare la seguente interfaccia intermedia e abbiamo fatto in modo che i nostri repository la estendessero invece di estenderla JpaRepositorydirettamente

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

La migliore soluzione per me. Non c'è bisogno di casting. return findById(id).orElse(null);è sufficiente
Ken007

Completamente d'accordo. Mi ha salvato centinaia di righe di modifiche.
Scott Carlson

7

Una trasformazione pragmatica

Vecchio modo:

Entity aThing = repository.findOne(1L);

Nuovo modo:

Optional<Entity> aThing = repository.findById(1L);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.