1. ホーム
  2. java

[解決済み] Spring Data JPA findOne() change to Optional how to use this?

2023-04-30 09:33:01

質問

私は勉強しています。 SpringBoot2.0Java8 .

そして、私はいくつかのブログ作成チュートリアルの例に従いました。

チュートリアルのソースコードは

@GetMapping("/{id}/edit")
public String edit(@PathVariable Long id, Model model) {
  model.addAttribute("categoryDto", categoryService.findOne(id));
  return "category/edit";
}

しかし、このコードはこのエラーを投げています。

categoryService.findOne(id)

JPAを変更しようと思っているのですが findOne() メソッドを Optional< S >

それを解決する方法は?

もっと詳しく

これはcategoryServiceのメソッドです。

public Category findOne(Long id) {
  return categoryRepository.findOne(id);
}

どのように解決するのですか?

少なくともから 2.0 バージョンでは Spring-Data-Jpa 修正済み findOne() .

今すぐ findOne() は同じ署名でも同じ動作でもありません。

以前は、定義された CrudRepository というインタフェースで定義されていました。

T findOne(ID primaryKey);

では、単一の findOne() の中にあるメソッド CrudRepository で定義されているものは QueryByExampleExecutor というインタフェースで定義されています。

<S extends T> Optional<S> findOne(Example<S> example);

これを最終的に実装しているのが SimpleJpaRepository のデフォルトの実装である CrudRepository インタフェースを実装しています。

このメソッドは例題検索によるクエリであり、その代わりにはならないでしょう。

実際、同じ動作をするメソッドは新しいAPIでも残っていますが、メソッド名が変更されています。

から改名されました。 findOne() から findById() の中に CrudRepository インタフェースになります。

Optional<T> findById(ID id); 

今度は Optional を防ぐにはそれほど悪いことではありません。 NullPointerException .

では、実際に呼び出すメソッドは Optional<T> findById(ID id) .

その使い方は?

学習する Optional の使い方を説明します。 ここでは、その仕様に関する重要な情報をお伝えします。

NULLでない値を含むか含まないかのコンテナオブジェクト。もし 値が存在する場合、isPresent() は真を返し、get() は値を返します。 が値を返します。

が存在するかどうかに依存する追加のメソッドが提供されています。 orElse() (値が存在しない場合、デフォルト値を返す) や ifPresent() (値が存在する場合、実行する) などです。 やifPresent() (値が存在する場合にコードブロックを実行する)などのメソッドがあります。 などがあります。)


を使用するためのいくつかのヒント OptionalOptional<T> findById(ID id) .

一般に、idでエンティティを探すと、それを返したり、それが取得できなかった場合に特定の処理を行いたいものです。

ここでは3つの古典的な使用例を紹介します。

  1. もしエンティティが見つかったらそれを取得したい、そうでなければデフォルト値を取得したいとします。

と書くことができます。

Foo foo = repository.findById(id)
                    .orElse(new Foo());

を取得するか、あるいは null のデフォルト値を取得することもできます(API変更前と同じ動作です).

Foo foo = repository.findById(id)
                    .orElse(null);

  1. エンティティが見つかればそれを返し、見つからなければ例外を投げたいとします。

と書くことができます。

return repository.findById(id)
        .orElseThrow(() -> new EntityNotFoundException(id));

  1. エンティティが見つかったかどうかによって異なる処理を適用したいとします(必ずしも例外を投げる必要はありません)。

と書くことができます。

Optional<Foo> fooOptional = fooRepository.findById(id);
if (fooOptional.isPresent()) {
    Foo foo = fooOptional.get();
    // processing with foo ...
} else {
    // alternative processing....
}