Ik gebruik Spring 5 in mijn project. Tot vandaag was er een beschikbare methode CrudRepository#findOne
.
Maar na het downloaden van de laatste snapshot verdween het plotseling! Is er een verwijzing dat de methode nu niet beschikbaar is?
Mijn afhankelijkheidslijst:
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'
}
UPDATE:
Het lijkt erop dat deze methode is vervangen door CrudRepository#findById
Antwoord 1, autoriteit 100%
Zie DATACMNS-944dat is gekoppeld aan deze commitdie de volgende namen heeft
╔═════════════════════╦═══════════════════════╗
║ Old name ║ New name ║
╠═════════════════════╬═══════════════════════╣
║ findOne(…) ║ findById(…) ║
╠═════════════════════╬═══════════════════════╣
║ save(Iterable) ║ saveAll(Iterable) ║
╠═════════════════════╬═══════════════════════╣
║ findAll(Iterable) ║ findAllById(…) ║
╠═════════════════════╬═══════════════════════╣
║ delete(ID) ║ deleteById(ID) ║
╠═════════════════════╬═══════════════════════╣
║ delete(Iterable) ║ deleteAll(Iterable) ║
╠═════════════════════╬═══════════════════════╣
║ exists() ║ existsById(…) ║
╚═════════════════════╩═══════════════════════╝
Antwoord 2, autoriteit 66%
Merk op dat findById
geen exacte vervanging is voor findOne
, het retourneert een Optional
in plaats van null
.
Omdat ik niet erg bekend ben met nieuwe Java-dingen, duurde het even voordat ik erachter kwam, maar dit verandert het findById
-gedrag in het findOne
-gedrag:
return rep.findById(id).orElse(null);
Antwoord 3, autoriteit 24%
We hadden vele honderden toepassingen van de oude findOne()
-methode. In plaats van aan een gigantische refactor te beginnen, hebben we uiteindelijk de volgende intermediaire interface gemaakt en deze door onze repositories laten uitbreiden in plaats van JpaRepository
rechtstreeks
@NoRepositoryBean
public interface BaseJpaRepository<T, ID> extends JpaRepository<T, ID> {
default T findOne(ID id) {
return (T) findById(id).orElse(null);
}
}
Antwoord 4, autoriteit 5%
Een pragmatische transformatie
Oude manier:
Entity aThing = repository.findOne(1L);
Nieuwe manier:
Optional<Entity> aThing = repository.findById(1L);
Antwoord 5
Een andere manier meer. Voeg een @Query
toe. Zelfs als ik de Optional
liever zou consumeren:
@Repository
public interface AccountRepository extends JpaRepository<AccountEntity, Long> {
@Query("SELECT a FROM AccountEntity a WHERE a.id =? 1")
public AccountEntity findOne(Long id);
}