source

임베디드 객체 속성별로 스프링 데이터 JPA 찾기

nicesource 2022. 11. 4. 21:26
반응형

임베디드 객체 속성별로 스프링 데이터 JPA 찾기

Spring Data JPA 저장소 인터페이스 메서드 시그니처를 작성하여 해당 엔티티에 포함된 객체의 속성을 가진 엔티티를 찾습니다.이것이 가능한지, 가능하다면 어떻게 할 수 있는지 아는 사람이 있습니까?

제 코드는 다음과 같습니다.

@Entity
@Table(name = "BOOK_UPDATE_QUEUE", indexes = { uniqueConstraints = @UniqueConstraint(columnNames = {
        "bookId", "region" }, name = "UK01_BOOK_UPDATE_QUEUE"))
public class QueuedBook implements Serializable {

    @Embedded
    @NotNull
    private BookId bookId;

    ...

}

@Embeddable
public class BookId implements Serializable {

    @NotNull
    @Size(min=1, max=40)
    private String bookId;

    @NotNull
    @Enumerated(EnumType.STRING)
    private Region region;

    ...

}

public interface QueuedBookRepo extends JpaRepository<QueuedBook, Long> {

    //I'd like to write a method like this, but can't figure out how to search by region,
    //when region is actually a part of the embedded BookId
    Page<QueuedBook> findByRegion(Region region, Pageable pageable);

}

Spring Data를 사용하여 이에 대한 쿼리를 작성할 수 있습니까?

이 메서드명은 다음과 같은 기능을 합니다.

Page<QueuedBook> findByBookIdRegion(Region region, Pageable pageable);

이에 대한 자세한 내용은 참조 문서의 쿼리 도출에 대한 섹션을 참조하십시오.

위의 findByBookIdRegion()은 나에게 효과가 없었습니다.다음은 String Data JPA의 최신 릴리스와 연동됩니다.

Page<QueuedBook> findByBookId_Region(Region region, Pageable pageable);

BookId를 조합된 프라이머리 키로 사용하는 경우 인터페이스를 다음 위치에서 변경해야 합니다.

public interface QueuedBookRepo extends JpaRepository<QueuedBook, Long> {

대상:

public interface QueuedBookRepo extends JpaRepository<QueuedBook, BookId> {

QueuedBook 클래스에서 주석 @Embedded를 @EmbeddedId로 변경합니다.

public class QueuedBook implements Serializable {

@EmbeddedId
@NotNull
private BookId bookId;

...

제 말에 따르면 스프링이 모든 사건을 쉽게 처리하지는 않는다고 합니다.당신의 경우, 다음과 같은 것이 효과적일 것입니다.

Page<QueuedBook> findByBookIdRegion(Region region, Pageable pageable);  

또는

Page<QueuedBook> findByBookId_Region(Region region, Pageable pageable);

단, 이는 또한 에 있는 필드의 명명 규칙에 따라 달라집니다.@Embeddable학급,

예: 다음 필드는 위에서 언급한 스타일에서는 작동하지 않을 수 있습니다.

private String cRcdDel;

두 가지 케이스를 모두 사용해 보았더니 효과가 없었습니다(Spring은 이러한 종류의 명명 규칙을 취급하지 않는 것 같습니다(특히 첫 번째 - 두 번째 글자에서는 대문자만 취급하고 있는 것 같습니다).

Page<QueuedBook> findByBookIdCRcdDel(String cRcdDel, Pageable pageable); 

또는

Page<QueuedBook> findByBookIdCRcdDel(String cRcdDel, Pageable pageable);

열 이름을 다음으로 변경했을 때

private String rcdDel;

다음 솔루션은 문제없이 정상적으로 동작합니다.

Page<QueuedBook> findByBookIdRcdDel(String rcdDel, Pageable pageable); 

또는

Page<QueuedBook> findByBookIdRcdDel(String rcdDel, Pageable pageable);

언급URL : https://stackoverflow.com/questions/24441411/spring-data-jpa-find-by-embedded-object-property

반응형