Méthode CrudRepository # findOne manquante

101

J'utilise Spring 5 dans mon projet. Jusqu'à aujourd'hui, il y avait une méthode disponible CrudRepository#findOne.

Mais après avoir téléchargé le dernier instantané, il a soudainement disparu! Y a-t-il une référence que la méthode n'est pas disponible maintenant?

Ma liste de dépendances:

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

METTRE À JOUR:

Il semble que cette méthode a été remplacée par CrudRepository#findById

Andrii Abramov
la source

Réponses:

150

Veuillez voir DATACMNS-944 qui est associé à ce commit qui a les renommés suivants

╔═════════════════════╦═══════════════════════╗
║      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
la source
1
Y a-t-il un guide de migration que j'ai manqué, ou cette ligne vague des notes de publication est-elle uniquement en termes d'annonces? "DATAJPA-1104 - S'adapter aux changements d'API dans les interfaces de référentiel" Comment l'avez-vous appris? :-)
Christian
2
Je ne sais pas s'il s'agit d'un guide de migration, mais vous pouvez trouver une référence à celui-ci dans le wiki du train de versions de Kay ( github.com/spring-projects/spring-data-commons/wiki/… ) ainsi que dans le journal des modifications Spring Data Commons ( docs .spring.io / spring-data / commons / docs / current / changelog.txt )
Sean Carroll
104

Notez que ce findByIdn'est pas un remplacement exact pour findOne, il renvoie un Optionalau lieu de null.

N'étant pas très familier avec les nouvelles choses Java, il m'a fallu un peu de temps pour comprendre, mais cela transforme le findByIdcomportement en findOneun:

return rep.findById(id).orElse(null);
Tinus Tate
la source
1
Ce n'est pas la meilleure idée: votre code continuera à fonctionner mais vous n'utilisez pas l'API comme vous le devriez . Optionala été ajouté pour nettoyer le code de toutes les nullvérifications. Changez simplement le type de retour de votre méthode et utilisez-la Optionalcomme un bon boy-scout devrait
GabiM
5
@GabiM Ce serait formidable si vous contrôliez toutes les méthodes en aval. Même si vous avez le contrôle de tout en aval et que votre projet n'est pas une dépendance pour un autre projet tiers, si les méthodes en aval codent pour null (comme dans, créez si ce n'est pas le cas, ou faites une logique si manquante), alors vous avez pour les réparer également.
zeusalmighty
En référence au lien de @GabiM, je voulais juste souligner que même ce lien dit: "Il est important de noter que l'intention de la classe Optional n'est pas de remplacer chaque référence nulle"
Scott Carlson
32

Nous avons eu plusieurs centaines d'utilisations de l'ancienne findOne()méthode. Plutôt que de nous lancer dans un refactor gigantesque, nous avons fini par créer l'interface intermédiaire suivante et avons demandé à nos référentiels de l'étendre au lieu de l'étendre JpaRepositorydirectement

@NoRepositoryBean
public interface BaseJpaRepository<T, ID> extends JpaRepository<T, ID> { 
    default T findOne(ID id) { 
        return (T) findById(id).orElse(null); 
    } 
} 
ashario
la source
Meilleure solution pour moi. Pas besoin de casting. return findById(id).orElse(null);suffit
Ken007
Entièrement d'accord. M'a sauvé des centaines de lignes de changements.
Scott Carlson
7

Une transformation pragmatique

Ancienne façon:

Entity aThing = repository.findOne(1L);

Nouvelle façon:

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