Spring Data JPA プログレッシブ ラーニング - クエリ メソッドをカスタマイズする方法は?

一緒に創造し、成長するために一緒に働きましょう!「ナゲッツ日替わり新プラン・8月アップデートチャレンジ」参加28日目、イベント詳細はこちら

1 query メソッドの構成と使用法を定義する

Spring Data JPAではCRUDをメソッド名で直接実装可能

メソッド名による CRUD の実装

メソッド名で CRUD を実装したい場合は、以下に示すようにUserRepisitory継承を行う必要があります。CrudRepository

public interface UserRepository extends CrudRepository<UserInfo,Integer> {

}
复制代码

UserRepository次に、サービス層でメソッドを呼び出すことができます

画像.png

CRUD メソッドへの選択的露出

一部のデータを表示するだけで変更したくない場合、すべてのメソッドを公開したくない場合があります。

具体的な操作は、Repository クラスを継承して独自のメソッドを作成することです。

public interface UserRepository extends Repository<UserInfo,Integer> {
    UserInfo findOne();
    List<UserInfo> findAll();
}
复制代码

この時controller、呼び出すとしたらこの2つの方法しかありません。

画像.png

2 メソッド クエリ ポリシーの設定

構成可能なメソッドのクエリ戦略により@EnableJpaRepositories、これは通常変更されず、デフォルトで問題ありません。

@EnableJpaRepositories(queryLookupStrategy = QueryLookupStrategy.Key.CREATE_IF_NOT_FOUND)
复制代码

ここで選択できるQueryLookupStrategy.Key値は 3 つあります

作成

Create はメソッド名に基づいて直接作成し、文字をUserInfo findByAgeAndName();削除してから , ,findByを解析します. メソッド名が規則に準拠していない場合は、エラーが報告されます. この戦略モードでは、@Query を構成しても意味がなく、メソッド名のみが解析されます。AgeAndName

USE_DECLARED_QUERY

It is created in a declarative way. この戦略モードでは、以下に示すように Query を構成する必要があり、メソッド名は解析されません。

@Query("select u from UserInfo u")
UserInfo getAllList();
复制代码

CREATE_IF_NOT_FOUND

これは上記の 2 つのケースを組み合わせたもので、最初に宣言型メソッドによって作成され、そうでない場合はメソッド名が解析されてクエリが作成されます。両方が満たされていない場合、起動時にエラーが報告されます。これがデフォルトのクエリ戦略です。

3 query メソッドの構文の定義

クエリ関数を含むメソッド名には、查询策略+查询字段+一些限制性条件明確なセマンティクスと完全な機能があります。次の表は、DMQ 構文で一般的に使用されるキーワードのリストです。

20191122172557317.png

例を 1 つまたは 2 つ挙げて説明します。

//去重,and的用法
List<UserInfo> findDistinctByAddressAndName();

//根据name查找,并根据ID进行逆序排列
List<UserInfo> findByNameOrderByIdDesc();
复制代码

すべてのテーブルは find で始まりますが、JPA は read、get、query、stream、count、exist、delete、remove などのプレフィックスもサポートしており、文字通り使用できます。

4 タイプ固有のパラメーター: Sort および Pageable

ソートとページングをサポートするために、JPA は Sort と Pageable という 2 つの特殊なタイプのパラメーターをサポートしています。

Sort は、クエリ時に動的な並べ替えを実現し、フィールドの並べ替えの方向を決定します。Pageable は、ページングと並べ替えの二重の効果を実現できます。

インターフェイスの定義方法と説明:

1 ページネーションと合計

Page<UserInfo> findByName(String name, Pageable pageable);
复制代码

この戻り値には、使用可能な要素とページの総数が含まれます。これはデフォルトで count ステートメントを実行するため、パフォーマンスは低くなります。

2 ページネーション

Slice<UserInfo> findByName(String name, Pageable pageable);
复制代码

返される結果は Slice であり、クエリ結果のみが合計数を気にしません。

3 ソート

List<UserInfo> findByName(String name, Sort sort);
复制代码

これは、Sort パラメーターを追加することで並べ替えのみが必要な場合に実行できます。

4 並べ替えとページング

List<UserInfo> findByName(String name, Pageable pageable);
复制代码

この場合、制限されたクエリの結果のみが返され、その他の情報は返されません。

サービス層で使用すると、次のことができます

//查询name是Luke的第一页,每页10个信息,并返回一共有多少页
Page<UserInfo> userList = userRepository.findByName("Luke",PageRequest.of(1,10));
//查询name是Luke的第一页的10条数据
Slice<UserInfo> userList = userRepository.findByName("Luke",PageRequest.of(1,10));
//查询name是Luke的数据,并按照age的逆序排列
List<UserInfo> userList = userRepository.findByName("Luke",new Sort(Sort.Direction.DESC,"age"));
//查询name是Luke的数据,取第一页的10条数据,并按照age的逆序排列
List<UserInfo> userList = userRepository.findByName("Luke",PageRequest.of(1,10,Sort.Direction.DESC,"age"));
复制代码

5 クエリ結果の制限: Fist と Top

前日のデータのみを取得したい場合は、First および Top キーワードを使用できます。

例えば

//按照name字段顺序排列,取第一个值
UserInfo findFirstByOrderByNameAsc();
//根据Id逆序排列并取第一个值
UserInfo findTopByOrderByIdDesc();
//排序后取前10个
List<UserInfo> findFirst10ByAge(Integer age,Sort sort);
复制代码

次の点に注意してください。

  • クエリを実行する場合、top と first の後に数字を使用して、必要な値の数を示すことができます。
  • 番号がない場合、デフォルトは 1 です
  • Pageable パラメータの場合、Top と First の後の数字が優先されます。
  • 固有のキーワードもサポートされています

6 @NotNull @NonNullApi和@Nullable

@NotNull

null 以外のパラメーターまたは戻り値に使用

@NonNullApi

パッケージで定義して、戻り値のデフォルトの動作が null 値を受け入れないことを示すことができます

@Nullable

null 許容パラメーターまたは戻り値の場合

次のコードは、パラメーターと戻り値の両方が空になる可能性があることを示しています。

@Nullable
UserInfo findByName(@Nullable String name);
复制代码

おすすめ

転載: juejin.im/post/7136566779282718751