CrudRepository#findOne方法丢失

119

我在我的项目中使用了Spring 5。直到今天,可用的方法是CrudRepository#findOne

但是在下载最新的快照后,它突然消失了!有没有参考说明该方法现在不可用?

我的依赖列表:

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 取代。

5个回答

179
请查看与此提交相关的链接 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(…)         ║
╚═════════════════════╩═══════════════════════╝

1
有没有我错过的迁移指南,还是这个发布说明中含糊不清的行都是所有公告中的内容?“DATAJPA-1104-适应存储库接口中的API更改”你是怎么找出来的? :-) - Christian
2
不确定这是否是任何迁移指南,但您可以在Kay发布列车维基(https://github.com/spring-projects/spring-data-commons/wiki/Release-Train-Kay)以及Spring Data Commons更改日志(https://docs.spring.io/spring-data/commons/docs/current/changelog.txt)中找到相关参考。 - Sean Carroll
对于那些在将他们的应用迁移到Spring 5(或Spring Boot 2)时遇到困难的人来说,这里有一个替代方案:https://dev59.com/h1cP5IYBdhLWcg3wnbUV#51643180。这真是太可悲了,他们只是在没有考虑向后兼容性的情况下删除了一个方法。 - Halil

116
请注意,findById并不完全替代findOne,它返回一个Optional而不是null
我对Java的新功能不太熟悉,花了一点时间才弄清楚,但这将findById的行为转换为findOne
return rep.findById(id).orElse(null);

1
不是最好的想法:你的代码将继续工作,但你没有像应该那样使用API。Optional被添加到清除所有的null检查。只需更改方法的返回类型并像好童子军一样使用Optional即可。 - GabiM
6
如果您能控制所有下游方法,那就太好了。即使您确实控制了所有下游操作并且您的项目不是某个第三方项目的依赖项,如果下游方法的代码为null(例如,如果不存在则创建,或者在缺失时执行某些逻辑),那么您也需要修复它们。 - zeusalmighty
1
关于@GabiM提供的链接,我想指出即使该链接也说:“重要的是要注意Optional类的意图不是替换每个空引用”。 - Scott Carlson

45

我们曾经使用过旧的findOne()方法很多次。为了避免进行大规模的重构,我们最终创建了以下中间接口,并让我们的存储库扩展它,而不是直接扩展JpaRepository

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

1
对我来说,最佳解决方案是不需要强制转换的。return findById(id).orElse(null); 就足够了。 - Ken007
完全同意。这让我省去了数百行的修改。 - Scott Carlson

8

一种实用的转换

旧方法:

Entity aThing = repository.findOne(1L);

新的方式:
Optional<Entity> aThing = repository.findById(1L);

1
另一种方式是使用@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);

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接