バネ投影

12430 ワード

スプリングデータJPAを使用している場合は、リポジトリクラスのすべてのクエリメソッドがエンティティオブジェクトを返すことを知っている必要があります.クエリメソッドからエンティティ全体を必要としない場合があります.私たちは、その実体のいくつかの属性だけに興味を持つかもしれません.これらの場合では、「プロジェクション」を使用して、エンティティクラス全体から必要なデータだけをプロジェクトします.
たとえば、従業員のためのエンティティークラスを持っていると言うことができます.
@Entity
@Table(name = "employee")
public class Employee implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", unique = true, nullable = false)
    private Long id;

    @Column(name = "firstName")
    private String firstName;

    @Column(name = "lastName")
    private String lastName;

    @Column(name = "designation")
    private String designation;

    @Column(name = "salary")
    private Integer salary;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "departmentId", updatable = false, insertable = false)
    private Department department;

    @Column(name = "departmentId")
    private Long departmentId;

    public Long getId() {
        return id;
    }

    public String getFirstName() {
        return firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public String getDesignation() {
        return designation;
    }

    public Integer getSalary() {
        return salary;
    }

    public Department getDepartment() {
        return department;
    }

    public Long getDepartmentId() {
        return departmentId;
    }
}
また、エンティティ全体を返す代わりに、ID、ファーストネーム、姓、および従業員の部門名だけが必要です.
つの方法はデータ転送オブジェクト(DTO)を使用することです.DTOクラスの目標は、クエリによって返されるデータの効率的で厳密な型表現を提供することです.これを達成するために、DTOクラスは典型的には、それぞれの属性、getterメソッド、setterメソッド、およびすべての属性を設定するコンストラクターだけを定義します.しかし、この突起はばね投影を用いることによって簡素化できる.
ばねデータJPAを使用しているときに射影を使用できる2つの方法があります.
  • インターフェースベース
  • のクラスベース
  • 本論文ではインタフェースベースの射影について論じる.

    インタフェースベースの投影
    名前が示すように、我々はインターフェースをここで使います.つは、エンティティークラスから取得するプロパティのgetterメソッドだけを持つインターフェイスを作成できます.このインターフェイスは、Spring Data JPAのリポジトリインターフェイスで記述するクエリメソッドの戻り値の型になります.

    例1 -
    まず、目的のプロパティを使用してインターフェイスを作成します.
    public interface EmployeeProjectionOne {
        Long getId();
    
        String getFirstName();
    
        String getLastName();
    
        DepartmentDetails getDepartment();
    
        interface DepartmentDetails {
            String getName();
        }
    }
    
    単に、このインターフェイスをリポジトリインターフェイス内のクエリメソッドの戻り値として追加できます.
    @Repository
    public interface EmployeeRepository extends JpaRepository<Employee, Long> {
        List<EmployeeProjectionOne> findByFirstName(String firstName);
    }
    
    このタイプの射影は「クローズドプロジェクション」と呼ばれ、この場合、インタフェースのゲッターメソッドはエンティティのプロパティのゲッターメソッドと厳密に一致します.また、再帰的な予測は、我々が所有側から逆側(従業員から部門へ)を横断するならば働くだけであることに注意してください.他の方法では、ネストしたプロジェクションをNULLに設定しました.

    例2 -
    一つは、いわゆるオープンプロジェクションを使用することができます.ここで、Spring式言語のみで選択的なプロパティのゲッターメソッドを使用してインターフェイスを作成します.これらの予測は、比べるものがない名前と実行時に計算された戻り値を持つインターフェイスメソッドを定義できます.
    SPEL式は既存のプロパティから新しいプロパティを定義するのに役立ちます.上記のように、プロパティ“fullname”が欲しいならば、spel式と@ value注釈を使って定義できます.同様に、エンティティークラスの入れ子になったプロパティから新しいプロパティを定義することもできます.
    public interface EmployeeProjectionTwo {
        Long getId();
    
        @Value("#{target.firstName} #{target.lastName}")
        String getFullName();
    
        @Value("#{target.department.name}")
        String getDepartmentName();
    }
    
    そして、respositoryでは、単に使用できます:
    @Repository
    public interface EmployeeRepository extends JpaRepository<Employee, Long> {
        List<EmployeeProjectionTwo> findByLastName(String lastName);
    }
    
    また、プロジェクション型インターフェイスで既定のメソッドを定義することもできます.

    例3
    今、あなたのニーズに基づいて、あなたのエンティティークラスのための' n 'の射影数を定義することができますが、これらの複数の戻り値タイプのために別々の倉庫インタフェースまたはメソッドを定義することはあまりにも多くの仕事です.
    このスプリングデータを簡素化するには、実行時にクエリメソッドから動的に返すプロジェクション型を定義できます.これは本当に便利なものですので、残りのAPIを開発しながら、このシナリオに遭遇します.
    Typeクラスのクエリメソッドに新しい引数を含めると、次のようにして投影型を設定します.
    @Repository
    public interface EmployeeRepository extends JpaRepository<Employee, Long> {
    
     List<T> findByFirstName(String firstName, Class<T> tClass);
    }
    
    次に、サービスクラスからリポジトリメソッドを呼び出します.
    @Override
    public List<EmployeeProjectionTwo> getAllByDynamicProjection() {
        return employeeRepository.findByFirstName("A", EmployeeProjectionTwo.class);
    }
    
    この型は、動的なプロジェクションと呼ばれます.クエリメソッドから戻る属性は、実行時に設定できます.
    これらは、春のデータJPAで開くことができるインターフェイスベースの投影の3種類です-オープン、クローズドとダイナミック型.私はまた、別の記事では、クラスベースのプロジェクトをカバーするので、この記事を好めばパート2のためにチューニング滞在.