射影
射影を使用してエンティティ・クラスの一部をカスタマイズする方法を学習します。
必要な結果がエンティティのサブセットである場合、つまり必要な結果がエンティティの一部である場合に射影を使用します。エンティティ・クラスにあるプロパティのサブセットを使用して、インタフェースまたはPOJOクラスを定義できます。次に、これらのインタフェースまたはPOJOクラスをカスタム・リポジトリ・メソッドのパラメータ化したタイプの結果として使用します。
例2-6 射影の使用
次の例では、
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_lastNamedeclare $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ノート:
Oracle NoSQL Database 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