缺少CrudRepository#findOne方法


101

我在项目中使用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

Answers:


150

请参阅与该提交关联的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发行培训Wiki(github.com/spring-projects/spring-data-commons/wiki/…)以及Spring Data Commons changelog(docs)中找到对它的引用。.spring.io / spring-data / commons / docs / current / changelog.txt
肖恩·卡罗尔

103

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

由于对新的Java东西不太熟悉,我花了一些时间才弄清楚,但这使findById行为变成了findOne一种:

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

1
不是最好的主意:你的代码会继续工作,但你不使用API ,你应该Optional已添加以清除所有null检查中的代码。只需更改您的返回类型,并Optional像个好童子军
GabiM

5
@GabiM如果您可以控制所有下游方法,那将非常好。即使您确实控制了下游的所有内容,并且您的项目也不是其他第三方项目的依赖项,但如果下游方法的代码为null(例如,如果不存在则创建,或者如果缺少则执行一些逻辑),那么您就有了还要修复它们。
zeusalmighty

关于@GabiM的链接,我只是想指出,即使该链接显示“重要的是要注意,Optional类的目的并不是要替换每个空引用”
Scott Carlson

32

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

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

我的最佳解决方案。无需铸造。return findById(id).orElse(null);足够
Ken007

完全同意。为我节省了数百行更改。
Scott Carlson

7

务实的转变

旧方法:

Entity aThing = repository.findOne(1L);

新方法:

Optional<Entity> aThing = repository.findById(1L);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.