一緒に創造し、成長するために一緒に働きましょう!「ナゲッツ日替わり新プラン・8月アップデートチャレンジ」参加28日目、イベント詳細はこちら
1 query メソッドの構成と使用法を定義する
Spring Data JPAではCRUDをメソッド名で直接実装可能
メソッド名による CRUD の実装
メソッド名で CRUD を実装したい場合は、以下に示すようにUserRepisitory
継承を行う必要があります。CrudRepository
public interface UserRepository extends CrudRepository<UserInfo,Integer> {
}
复制代码
UserRepository
次に、サービス層でメソッドを呼び出すことができます
CRUD メソッドへの選択的露出
一部のデータを表示するだけで変更したくない場合、すべてのメソッドを公開したくない場合があります。
具体的な操作は、Repository クラスを継承して独自のメソッドを作成することです。
public interface UserRepository extends Repository<UserInfo,Integer> {
UserInfo findOne();
List<UserInfo> findAll();
}
复制代码
この時controller
、呼び出すとしたらこの2つの方法しかありません。
2 メソッド クエリ ポリシーの設定
構成可能なメソッドのクエリ戦略により@EnableJpaRepositories
、これは通常変更されず、デフォルトで問題ありません。
@EnableJpaRepositories(queryLookupStrategy = QueryLookupStrategy.Key.CREATE_IF_NOT_FOUND)
复制代码
ここで選択できるQueryLookupStrategy.Key
値は 3 つあります
作成
Create はメソッド名に基づいて直接作成し、文字をUserInfo findByAgeAndName();
削除してから , ,findBy
を解析します. メソッド名が規則に準拠していない場合は、エラーが報告されます. この戦略モードでは、@Query を構成しても意味がなく、メソッド名のみが解析されます。Age
And
Name
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 構文で一般的に使用されるキーワードのリストです。
例を 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);
复制代码