Spring Data JPA - すべてのリポジトリにメソッドを追加する

Spring Data JPA –すべてのリポジトリにメソッドを追加する

1. 概要

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

ただし、すべてのリポジトリで使用できるカスタムメソッドを追加する場合、プロセスは少し複雑になります。 これが、Spring DataJPAを使用してここで検討する内容です。

Spring Data JPAの構成と使用の詳細については、以前の記事Guide to Hibernate with Spring 4Introduction to Spring Data JPAを確認してください。

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

最初に、カスタムメソッドを宣言する新しいインターフェイスを作成する必要があります。

@NoRepositoryBean
public interface ExtendedRepository
  extends JpaRepository {

    public List findByAttributeContainsText(String attributeName, String text);
}

私たちのインターフェースはJpaRepositoryインターフェースを拡張しているので、すべての標準的な動作の恩恵を受けることができます。

また、@NoRepositoryBeanアノテーションが追加されていることにも気付くでしょう。 それ以外の場合、デフォルトのSpringの動作では、Repository.のすべてのサブインターフェイスの実装が作成されるため、これが必要です。

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

3. 基本クラスの実装

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

public class ExtendedRepositoryImpl
  extends SimpleJpaRepository implements ExtendedRepository {

    private EntityManager entityManager;

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

    // ...
}

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

これには、親クラスからコンストラクターを呼び出すJpaEntityInformationおよびEntityManagerパラメーターを使用してコンストラクターを作成する必要があります。

カスタムメソッドで使用するには、EntityManagerプロパティも必要です。

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

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

ここで、findByAttributeContainsText()メソッドは、パラメーターとして指定されたString値を含む特定の属性を持つタイプTのすべてのオブジェクトを検索します。

4. JPAの構成

Springに、リポジトリ実装の構築にデフォルトのクラスではなくカスタムクラスを使用するように指示するには、we can use the repositoryBaseClass attribute

@Configuration
@EnableJpaRepositories(basePackages = "org.example.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 {
}

以上です! これで、実装にはカスタム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 students
          = extendedStudentRepository.findByAttributeContainsText("name", "john");

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

このテストでは、最初にextendedStudentRepository Beanを使用して、3つのStudentレコードを作成します。 次に、findByAttributeContains()メソッドが呼び出され、名前に「john」というテキストが含まれているすべての学生が検索されます。

ExtendedStudentRepositoryクラスは、save()などの標準メソッドと追加したカスタムメソッドの両方を使用できます。

7. 結論

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

例の完全なソースコードはover on GitHubにあります。