射影

必要な結果がエンティティのサブセットである場合、つまり必要な結果がエンティティの一部にすぎない場合に射影を使用します。エンティティ・クラスにあるプロパティのサブセットを使用して、インタフェースまたはPOJOクラスを定義できます。次に、これらのインタフェースまたはPOJOクラスをカスタム・リポジトリ・メソッドのパラメータ化したタイプの結果として使用します。

次の例は、Studentエンティティ・クラスのコンテキストで示されています。Studentエンティティ・クラスおよびStudentRepositoryインタフェースの作成の詳細は、「例: Spring Data Frameworkを使用したOracle NoSQL Databaseへのアクセス」を参照してください。
  1. インタフェース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;
      }
    }
  2. 新しいタイプ(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注釈を使用した射影はサポートされていません。戻りタイプをパラメータ化しても、動的射影はサポートされません。
  3. 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クラスの接続詳細を指定します。
  4. ランナー・クラスからプログラムを実行します。次の出力が表示されます。
    With projection findAllByLastName: Smith
    StudentView :Student{id=0, firstName='null', lastName='Smith', createdAt='null'}
    With projection getAllByLastName: Smith
    StudentProjection.firstName :John
    StudentProjection.lastName :Smith