導出問合せ

SpringのPagingAndSortingRepositoryインタフェースで提供される問合せメソッドとは別に、導出問合せを定義することもできます。Spring Data Frameworkには、組込みの問合せ作成機能があります。Spring Data Frameworkでは、問合せがJavaメソッド名のみから直接作成されます。

たとえば、次のような構造のJavaメソッド名があるとします。

List<Customer> findByFirstName(String firstName);

この場合、次の導出問合せがSpring Data Frameworkによって自動作成されます。

declare $firstName String;

SELECT * FROM Customer AS c WHERE c.kv_json_.firstName = $firstName;

この導出問合せが機能するための唯一の要件は、このJavaメソッドをNosqlRepositoryインタフェースを拡張するインタフェースで定義する必要があることです。NosqlRepositoryインタフェースでは、導出問合せを担当するRepositoryインタフェースを拡張します。Javaメソッド名から共通の接頭辞が削除され、残りのJavaメソッド名から問合せの制約が解析されます。Springの導出問合せ作成の詳細は、「Query Creation」を参照してください。

Javaメソッドのうち接頭辞がfind…Byread…Byquery…Bycount…Byget…Byexists…Bydelete…Byおよびremove…Byのメソッドは、Spring Data Frameworkによって導出問合せのメソッドとみなされます。これらの接頭辞とは別に、その他のキーワードをJavaメソッド名に含めることもできます。次の項では、特定のキーワードを使用した場合に生成される詳細な導出問合せのスニペットについて説明します。

And

次の構造では、メソッド名にandという語が含まれています。

Iterable<Student> findByFirstNameAndLastName(String firstname, String lastname);

この場合、次の導出問合せがSpring Data Frameworkによって自動作成されます。

declare $p_firstName String;
$p_lastName String;
 
SELECT * FROM Student AS s WHERE (
    s.kv_json_.firstName = $p_firstName AND s.kv_json_.lastName = $p_lastName)

ノート:

Oracle NoSQL Database SDK for Spring Dataでは、論理演算子(andor)の組合せを使用する導出問合せがサポートされています。生成された問合せは、Oracle NoSQL Database SQL問合せ言語で定義された演算子の優先順位のルールに従います。Oracle NoSQL Database SQL問合せ言語の演算子の優先順位の詳細は、『SQLリファレンス・ガイド』演算子の優先順位に関する項を参照してください。

Or

次の構造では、メソッド名にorという語が含まれています。

Iterable<Student> findByFirstNameOrLastName(String firstname, String lastname);

この場合、次の導出問合せがSpring Data Frameworkによって自動作成されます。

declare $p_firstName String;
$p_lastName String;
 
SELECT * FROM Student AS s WHERE (
    s.kv_json_.firstName = $p_firstName OR s.kv_json_.lastName = $p_lastName)

ノート:

Oracle NoSQL Database SDK for Spring Dataでは、論理演算子(andor)の組合せを使用する導出問合せがサポートされています。生成された問合せは、Oracle NoSQL Database SQL問合せ言語で定義された演算子の優先順位のルールに従います。Oracle NoSQL Database SQL問合せ言語の演算子の優先順位の詳細は、『SQLリファレンス・ガイド』演算子の優先順位に関する項を参照してください。

OrderBy (Asc/Desc)

次の構造では、メソッド名にorderbyという語が含まれています。

Iterable<Student> findByLastNameOrderByFirstNameAsc(String lastname);

この場合、次の導出問合せがSpring Data Frameworkによって自動作成されます。

declare $p_lastName String;
 
SELECT * FROM Student AS s 
    WHERE s.kv_json_.lastName = $p_lastName ORDER BY s.kv_json_.firstName ASC

次の構造では、メソッド名にorderbyという語が含まれています。

Iterable<Student> findByLastNameOrderByFirstNameDesc(String lastname);

この場合、次の導出問合せがSpring Data Frameworkによって自動作成されます。

declare $p_lastName String;
 
SELECT * FROM Student AS s 
    WHERE s.kv_json_.lastName = $p_lastName ORDER BY s.kv_json_.firstName DESC

First

次の構造では、メソッド名にfirstという語が含まれています。

Page<Student> queryFirst5ByLastname(String lastname, Pageable pageable);

この場合、次の導出問合せがSpring Data Frameworkによって自動作成されます。

Pageの詳細は、Pageを参照してください。Pageableの詳細は、Pageableを参照してください。

declare $p_lastName String;
$kv_limit_ Long;
$kv_offset_ Long;
 
SELECT * FROM Student AS s 
    WHERE s.kv_json_.lastName = $p_lastName LIMIT $kv_limit_ OFFSET $kv_offset_

Top

次の構造では、メソッド名にtopという語が含まれています。

Slice<Student> findTop10ByLastName(String lastname, Pageable pageable);

この場合、次の導出問合せがSpring Data Frameworkによって自動作成されます。

Sliceの詳細は、Sliceを参照してください。

declare $p_lastName String;
$kv_limit_ Long;
$kv_offset_ Long;
 
SELECT * FROM Student AS s 
    WHERE s.kv_json_.lastName = $p_lastName LIMIT $kv_limit_ OFFSET $kv_offset_

Oracle NoSQL Database SDK for Spring Dataの問合せメソッドでサポートされているキーワードの完全なリストについては、「問合せメソッドでサポートされているキーワード」を参照してください。

次に、Oracle NoSQL Databaseリポジトリの例を示します。これは、NosqlRepositoryインタフェースを拡張する必要があります。バインドされた型は、IDフィールドのエンティティ・タイプとデータ型を表しています。

interface PersonRepository extends NosqlRepository<Person, Long> {
    List<Person> findByFirstNameAndLastName(String firstname, String lastname);
    List<Person> findByLastNameOrderByFirstNameDesc(String lastname);
}