Falta el método CrudRepository # findOne

101

Estoy usando Spring 5 en mi proyecto. Hasta hoy había método disponible CrudRepository#findOne.

Pero después de descargar la última instantánea, ¡desapareció de repente! ¿Hay alguna referencia de que el método no está disponible ahora?

Mi lista de dependencias:

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

ACTUALIZAR:

Parece que este método ha sido reemplazado por CrudRepository#findById

Andrii Abramov
fuente

Respuestas:

150

Consulte DATACMNS-944 que está asociado a esta confirmación que tiene los siguientes cambios de nombre

╔═════════════════════╦═══════════════════════╗
║      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
fuente
1
¿Hay alguna guía de migración que me perdí o esta línea vaga de las notas de la versión se refiere a los anuncios que hubo? "DATAJPA-1104 - Adaptarse a los cambios de API en las interfaces del repositorio" ¿Cómo se enteró? :-)
Christian
2
No estoy seguro de si esta es una guía de migración, pero puede encontrar una referencia a ella en la wiki del tren de lanzamiento de Kay ( github.com/spring-projects/spring-data-commons/wiki/… ), así como en el registro de cambios de Spring Data Commons ( docs .spring.io / spring-data / commons / docs / current / changelog.txt )
Sean Carroll
104

Tenga en cuenta que findByIdno es un reemplazo exacto de findOne, devuelve un en Optionallugar de null.

Al no estar muy familiarizado con las nuevas cosas de Java, me tomó un poco de tiempo darme cuenta, pero esto convierte el findByIdcomportamiento en findOneuno:

return rep.findById(id).orElse(null);
Tinus Tate
fuente
1
No es la mejor idea: su código seguirá funcionando pero no está usando la API como debería . Optionalse agregó para limpiar el código de todos los nullcontroles. Sólo cambia el tipo de retorno del método y que su uso Optionalcomo un buen chico-Scout debe
GabiM
5
@GabiM Esto sería genial si tiene el control de todos los métodos posteriores. Incluso si tiene el control de todo en sentido descendente y su proyecto no es una dependencia para algún otro proyecto de terceros, si los métodos en sentido descendente codifican nulo (como en, crear si no existe, o hacer algo de lógica si falta), entonces tiene para arreglarlos también.
zeusalmighty
En referencia al enlace de @GabiM, solo quería señalar que incluso ese enlace dice "Es importante tener en cuenta que la intención de la clase Opcional no es reemplazar todas las referencias nulas"
Scott Carlson
32

Tuvimos muchos cientos de usos del findOne()método antiguo . En lugar de embarcarnos en una refactorización gigantesca, terminamos creando la siguiente interfaz intermedia e hicimos que nuestros repositorios la extendieran en lugar de extenderla JpaRepositorydirectamente

@NoRepositoryBean
public interface BaseJpaRepository<T, ID> extends JpaRepository<T, ID> { 
    default T findOne(ID id) { 
        return (T) findById(id).orElse(null); 
    } 
} 
ashario
fuente
La mejor solución para mí. No es necesario el casting. return findById(id).orElse(null);suficiente
Ken007
Totalmente de acuerdo. Me salvó cientos de líneas de cambios.
Scott Carlson
7

Una transformación pragmática

Vieja forma:

Entity aThing = repository.findOne(1L);

Nueva manera:

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