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.