1. 개요

이 예제에서는 복합 키 기반 JPA 엔터티를 쿼리하기 위한 @EmbeddedId 어노테이션 및 " findBy " 메서드의 사용을 다룰 것입니다.

따라서 @EmbeddeId@Embeddable 어노테이션을 사용 하여 JPA 엔터티의 복합 키를 나타냅니다 . 또한 목표를 달성 하려면 Spring JpaRepository 를 사용해야 합니다.

우리는 부분 기본 키로 개체를 쿼리하는 데 집중할 것입니다.

2. @Embeddable@EmbeddedId 필요

소프트웨어에서 우리는 테이블의 항목을 정의하기 위해 복합 기본 키가 필요한 많은 사용 사례를 접하게 됩니다. 복합 기본 키는 테이블의 행을 고유하게 식별하기 위해 둘 이상의 열을 사용하는 키입니다 .

클래스에서 @Embeddable 어노테이션을 사용하여 Spring 데이터에서 복합 기본 키를 나타냅니다 . 그런 다음 이 키는 @Embeddable 유형 의 필드에서 @EmbeddedId 어노테이션을 사용하여 복합 기본 키로 테이블의 해당 엔티티 클래스에 포함됩니다 .

3. 예시

책 레코드에 저자이름 으로 구성된 복합 기본 키가 있는 테이블을 고려하십시오 . 때로는 기본 키의 일부로 을 찾고 싶을 수도 있습니다 . 예를 들어 사용자는 특정 저자 의 책만 검색하려고 할 수 있습니다 . JPA로 이 작업을 수행하는 방법을 배웁니다.

기본 애플리케이션은 @EmbeddedId BookId가 있는 @Embeddable BookId@Entity Book 으로 구성됩니다.

3.1. @포함 가능

이 섹션에서 BookId 클래스를 정의해 보겠습니다 . 저자이름고유한 BookId 를 지정합니다 — 클래스는 Serializable 이며 equalshashCode 메서드 를 모두 구현합니다 .

@Embeddable
public class BookId implements Serializable {

    private String author;
    private String name;

    // standard getters and setters
}

3.2. @Entity@EmbeddedId

Book 엔터티에는 @EmbeddedId BookId 및 과 관련된 기타 필드가 있습니다 . BookId 는 Book 엔터티에 복합 키가 있음을 JPA에 알립니다 .

@Entity
public class Book {

    @EmbeddedId
    private BookId id;
    private String genre;
    private Integer price;

    //standard getters and setters
}

3.3. JPA 저장소 및 메소드 이름 지정

엔티티 BookBookId 로 JpaRepository 를 확장하여 JPA 저장소 인터페이스를 신속하게 정의해 보겠습니다 .

@Repository
public interface BookRepository extends JpaRepository<Book, BookId> {

    List<Book> findByIdName(String name);

    List<Book> findByIdAuthor(String author);
}

id 변수의 필드 이름 중 일부를 사용하여 Spring Data 쿼리 메서드를 파생합니다. 따라서 JPA는 부분 기본 키 쿼리를 다음과 같이 해석합니다.

findByIdName -> directive "findBy" field "id.name"
findByIdAuthor -> directive "findBy" field "id.author"

4. 결론

JPA를 사용하여 복합 키를 효율적으로 매핑하고 파생 쿼리를 통해 쿼리할 수 있습니다.

이 기사에서는 부분 ID 필드 검색을 실행하는 작은 예를 보았습니다. 복합 기본 키를 나타내는 @Embeddable 어노테이션과 엔티티에 복합 키를 삽입하는 @EmbeddedId 어노테이션을 살펴 보았습니다.

마지막으로 JpaRepository findBy 파생 메서드 를 사용  하여 부분 ID 필드로 검색하는 방법을 살펴보았습니다.

항상 그렇듯이 이 사용방법(예제)의 예제 코드는  GitHub 에서 사용할 수 있습니다 .

Persistence footer banner