射影
射影を使用してエンティティ・クラスの一部をカスタマイズする方法を学習します。
必要な結果がエンティティのサブセットである場合、つまり必要な結果がエンティティの一部である場合に射影を使用します。エンティティ・クラスにあるプロパティのサブセットを使用して、インタフェースまたは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_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
ノート:
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