Missing CrudRepository#findOne method

我在我的项目中使用 Spring5。直到今天还有可用的方法 CrudRepository#findOne

But after downloading latest snapshot it suddenly disappeared! Is there any reference that the method is not available now?

我的依赖清单:

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

更新:

看起来这个方法已经被 CrudRepository#findById代替了

64892 次浏览

请参阅与 这个承诺相关联的 DATACMNS-944,它有以下重命名

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

A pragmatic transform

老办法:

Entity aThing = repository.findOne(1L);

新方法:

Optional<Entity> aThing = repository.findById(1L);

请注意,findById并不完全取代 findOne,它返回的是 Optional而不是 null

由于不太熟悉 Java 的新特性,我花了一些时间才弄明白,但这把 findById的行为变成了 findOne的行为:

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

我们使用了数百种旧的 findOne()方法。我们没有进行大规模的重构,而是创建了以下中间接口,并让我们的存储库对其进行扩展,而不是直接扩展 JpaRepository

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

另一种方式更多。添加一个 @Query。即使我更喜欢使用 Optional:

@Repository
public interface AccountRepository extends JpaRepository<AccountEntity, Long> {


@Query("SELECT a FROM AccountEntity a WHERE a.id =? 1")
public AccountEntity findOne(Long id);


}