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

回答:


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の変更に適応する」どのようにして知りましたか?:-)
クリスチャン

2
これが移行ガイドかどうかはわかりませんが、Kayリリーストレインwiki(github.com/spring-projects/spring-data-commons/wiki/…)やSpring Data Commonsの変更ログ(docs)で参照できます。.spring.io / spring-data / commons / docs / current / changelog.txt
Sean Carroll、

103

findByIdはの正確な置き換えではなく、findOneOptional代わりにを返しますnull

新しいJavaについてあまり詳しくないので、理解するのに少し時間がかかりましたが、これによりfindById動作が次のようになりますfindOne

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

1
ない最高のアイデアは:あなたのコードが動作し続けますが、あなたはAPIを使用していないあなたが必要としてOptionalすべてのnullチェックからコードを削除するために追加されました。メソッドの戻り値の型を変更し、ボーイスカウトのOptionalように使用する
GabiM

5
@GabiMこれは、すべてのメソッドをダウンストリームで制御できる場合に最適です。ダウンストリームのすべてを制御していて、プロジェクトが他のサードパーティプロジェクトの依存関係ではない場合でも、nullのメソッドダウンストリームコード(存在しない場合は作成、存在しない場合は作成するなど)がある場合は、同様にそれらを修正します。
zeusalmighty

@GabiMからのリンクを参照するには、私はちょうどそれさえもリンクが「オプションのクラスの意図は、すべて単一のヌル参照置き換えることではないことに注意することが重要である」ということを指摘したかった
スコット・カールソン

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

完全に同意する。何百行もの変更を保存しました。
スコットカールソン

7

実用的な変換

古い方法:

Entity aThing = repository.findOne(1L);

新しい方法:

Optional<Entity> aThing = repository.findById(1L);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.