データ]

  • リンク:/tag/jpa/[JPA]


1概要

Spring Dataは、単にリポジトリインタフェースを定義することで、エンティティを扱う作業を非常に簡単にします。これらには事前定義された一連のメソッドが付属しており、各インタフェースにカスタムメソッドを追加することができます。

ただし、すべてのリポジトリで利用可能なカスタムメソッドを追加したい場合、プロセスはもう少し複雑です。そのため、ここでSpring Data JPAを使用して検討します。

Spring Data JPAの設定と使用の詳細については、以前の記事をチェックしてください。


2ベースリポジトリインタフェースの定義

まず、カスタムメソッドを宣言する新しいインタフェースを作成しなければなりません。

@NoRepositoryBean
public interface ExtendedRepository<T, ID extends Serializable>
  extends JpaRepository<T, ID> {

    public List<T> findByAttributeContainsText(String attributeName, String text);
}

私たちのインターフェースは

JpaRepository

インターフェースを拡張しているので、私たちはすべての標準的な振る舞いから利益を得ることができます。


  • @ NoRepositoryBean

    アノテーションを追加したことにも気付くでしょう。そうでなければ、デフォルトのSpringの振る舞いは

    Repository .

    ** のすべてのサブインターフェースのための実装を作成することであるので、これは必要です。

ここでは、実際のエンティティ固有のDAOインターフェイスによって拡張されることを意図したインターフェイスにすぎないため、使用する必要がある実装を提供します。


3基本クラスの実装

次に、

ExtendedRepository

インターフェースの実装を提供します。

public class ExtendedRepositoryImpl<T, ID extends Serializable>
  extends SimpleJpaRepository<T, ID> implements ExtendedRepository<T, ID> {

    private EntityManager entityManager;

    public ExtendedRepositoryImpl(JpaEntityInformation<T, ?>
      entityInformation, EntityManager entityManager) {
        super(entityInformation, entityManager);
        this.entityManager = entityManager;
    }

   //...
}

このクラスは

SimpleJpaRepository

クラスを拡張します。これは、Springがリポジトリインタフェースの実装を提供するために使用するデフォルトクラスです。

これには、親クラスからコンストラクタを呼び出す

JpaEntityInformation

および

EntityManager

パラメータを使用してコンストラクタを作成する必要があります。

カスタムメソッドで使用するには

EntityManager

プロパティも必要です。

また、

ExtendedRepository

インターフェースから継承したカスタムメソッドを実装する必要があります。

@Transactional
public List<T> findByAttributeContainsText(String attributeName, String text) {
    CriteriaBuilder builder = entityManager.getCriteriaBuilder();
    CriteriaQuery<T> cQuery = builder.createQuery(getDomainClass());
    Root<T> root = cQuery.from(getDomainClass());
    cQuery
      .select(root)
      .where(builder
        .like(root.<String>get(attributeName), "%" + text + "%"));
    TypedQuery<T> query = entityManager.createQuery(cQuery);
    return query.getResultList();
}

ここで、

findByAttributeContainsText()

メソッドは、パラメータとして与えられた

String

値を含む特定の属性を持つT型のすべてのオブジェクトを検索します。


4 JPAの設定

Springに、リポジトリ実装を構築するためのデフォルトのクラスの代わりに私たちのカスタムクラスを使うように指示するためには、

repositoryBaseClass

属性を使うことができます

@Configuration
@EnableJpaRepositories(basePackages = "org.baeldung.persistence.dao",
  repositoryBaseClass = ExtendedRepositoryImpl.class)
public class StudentJPAH2Config {
   //additional JPA Configuration
}


5エンティティリポジトリの作成

次に、新しいインターフェースの使い方を見てみましょう。

まず、簡単な

Student

エンティティを追加しましょう。

@Entity
public class Student {

    @Id
    private long id;
    private String name;

   //standard constructor, getters, setters
}

その後、

ExtendedRepository

インターフェースを拡張する

Student

エンティティー用のDAOを作成できます。

public interface ExtendedStudentRepository extends ExtendedRepository<Student, Long> {
}

以上です!これで私たちの実装はカスタム

findByAttributeContainsText()

メソッドを持つことになります。

同様に、

ExtendedRepository

インターフェースを拡張することによって定義したインターフェースも同じメソッドを持ちます。


6. リポジトリのテスト

実行中のカスタムメソッドを示す

JUnit

テストを作成しましょう。

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = { StudentJPAH2Config.class })
public class ExtendedStudentRepositoryIntegrationTest {

    @Resource
    private ExtendedStudentRepository extendedStudentRepository;

    @Before
    public void setup() {
        Student student = new Student(1, "john");
        extendedStudentRepository.save(student);
        Student student2 = new Student(2, "johnson");
        extendedStudentRepository.save(student2);
        Student student3 = new Student(3, "tom");
        extendedStudentRepository.save(student3);
    }

    @Test
    public void givenStudents__whenFindByName__thenOk(){
        List<Student> students
          = extendedStudentRepository.findByAttributeContainsText("name", "john");

        assertEquals("size incorrect", 2, students.size());
    }
}

テストは最初に

extendedStudentRepository

Beanを使用して3つの生徒レコードを作成します。次に、

findByAttributeContains()

メソッドが呼び出され、名前にテキスト “john”が含まれるすべての生徒が検索されます。


ExtendedStudentRepository

クラスでは、

save()

などの標準メソッドと追加したカスタムメソッドの両方を使用できます。


7. 結論

この簡単な記事では、Spring Data JPAのすべてのリポジトリにカスタムメソッドを追加する方法を説明しました。

例の完全なソースコードはhttps://github.com/eugenp/tutorials/tree/master/persistence-modules/spring-data-jpa[GitHubに載っています]。