射影
必要な結果がエンティティのサブセットである場合、つまり必要な結果がエンティティの一部にすぎない場合に射影を使用します。エンティティ・クラスにあるプロパティのサブセットを使用して、インタフェースまたはPOJOクラスを定義できます。次に、これらのインタフェースまたはPOJOクラスをカスタム・リポジトリ・メソッドのパラメータ化したタイプの結果として使用します。
例
次の例は、
Student
エンティティ・クラスのコンテキストで示されています。Student
エンティティ・クラスおよびStudentRepository
インタフェースの作成の詳細は、「例: Spring Data Frameworkを使用したOracle NoSQL Databaseへのアクセス」を参照してください。
- インタフェース
StudentView
およびPOJOクラスStudentProjection
を定義します。public interface StudentView { String getLastName(); }
public class StudentProjection { private String firstName; private String lastName; public StudentProjection(String firstName, String lastName) { this.firstName = firstName; this.lastName = lastName; } public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } }
- 新しいタイプ(
StudentView
およびStudentProjection
)は、StudentRepository
クラスのカスタム検索メソッドの結果として使用できます。import java.util.Date; import com.oracle.nosql.spring.data.repository.NosqlRepository; public interface StudentRepository extends NosqlRepository<Student, Long> { Iterable<Student> findByLastName(String lastname); Iterable<Student> findByCreatedAtBetween(Date start, Date end); Iterable<StudentView> findAllByLastName(String lastName); Iterable<StudentProjection> getAllByLastName(String lastName); }
これらの結果には行のサブセットが含まれるため、Idプロパティが含まれていない場合、返されるセットに重複を含めることができます。これらの重複が不要な場合は、
Distinct
キーワードを使用して重複を消去できます。例:List<StudentView>findAllDistinctByLastName(String lastName); List<StudentProjection> getAllDistinctByLastName(String lastName);
これらのメソッドによって、次の問合せが生成されます。declare $p_lastName String; select distinct {'lastName': t.kv_json_.lastName} as kv_json_ from Student \ as t where t.kv_json_.lastName = $p_lastName
declare $p_lastName String; select distinct {'firstName': t.kv_json_.firstName, 'lastName': t.kv_json_.lastName} as kv_json_ \ from Student as t where t.kv_json_.lastName = $p_lastName
ノート:
NoSQL SDK for Spring Dataでは、エンティティ・プロパティのサブセットを含むインタフェースおよびクラス・ベースの射影のみがサポートされます。@Value注釈を使用した射影はサポートされていません。戻りタイプをパラメータ化しても、動的射影はサポートされません。 run
メソッドを変更し、カスタム・メソッド(射影インタフェースおよびPOJOクラスで定義)を起動します。// Using projection interface System.out.println("\n With projection findAllByLastName: Smith"); repo.findAllByLastName("Smith") .forEach(c -> System.out.println("StudentView :" + c)); // using projection POJO class here System.out.println("\n With projection getAllByLastName: Smith"); repo.getAllByLastName("Smith") .forEach(c -> System.out.println("StudentProjection.firstName :" + c.getFirstName() + " StudentProjection.lastName :" + c.getLastName() ));
ノート:
「例: Spring Data Frameworkを使用したOracle NoSQL Databaseへのアクセス」を参照して、AppConfig
クラスの詳細を取得し、データベース、およびrun
メソッドを実装し、main
メソッドを持つApp
クラスの接続詳細を指定します。- ランナー・クラスからプログラムを実行します。次の出力が表示されます。
With projection findAllByLastName: Smith StudentView :Student{id=0, firstName='null', lastName='Smith', createdAt='null'} With projection getAllByLastName: Smith StudentProjection.firstName :John StudentProjection.lastName :Smith