[Spring Data JPA] SqlResultSetMapping과NamedNativeQuery의 사용법 노트

10697 단어 JavaSpring Boottech

개요


여러 테이블을 결합할 때의 SELECT 문구 등 JPA가 자동으로 생성하는 방법에는 대응하기 어려울 때도 있다.JPA(hibernate)의 테이블 연결 트랩(n+1 문제)에서 보듯이 Enity 간에 정의하고 결합 관계를 맺는 것도 불가능한 것은 아니지만 SELECT 문장을 직접 사용하고 싶을 때가 있다.
이번에는 대응하는 방법으로 SqlResultSetMappingNamedNativeQuery 에니티에 데이터를 적어서 넣는 방법을 사용해 보려고 합니다.

사용법


SqlResultSetMapping의 가이드5.エンティティマッピング에 기술된 대로 @SqlResultSetMapping에 Enity의 범주, 속성 및 열에 대한 링크를 정의합니다.또한 @NamedNativeQuery에서 SQL 문을 정의하여 Sql ResultSetMapping과 연결합니다.
또한 How to Use Named Queries with Spring Data JPA 글에서 말한 바와 같이 Repository에서 Named NativeQuery가 정의한 이름으로 방법 이름을 정의한다.

샘플


실제 샘플로 urls표와domains표가 있을 때 이 두 표를 결합시켜 정보를 얻는 예를 소개한다.

Entity


@SqlResultSetMapping(
  name = "siteInfoMap",
  entities = {
    @EntityResult(
      entityClass= SiteInfo.class,
        fields = {
				   // カラム名とプロパティ名を紐付け
          @FieldResult(name="urlId", column="url_id"),
          @FieldResult(name="url", column="url"),
          @FieldResult(name="domainId", column="domain_id"),
          @FieldResult(name="domain", column="domain")
        }
    )
  }
)
@NamedNativeQuery(
  name = "SiteInfo.getSiteInfo",
	// SqlResultSetMappingで定義した名前
  resultSetMapping = "siteInfoMap",
  query = "select u.url_id, u.url, u.domain_id, d.domain from urls u inner join domains d on d.id = u.domain_id"
)
@Entity
public class SiteInfo {
  @Id
	private Long urlId;
  private String url;
  private Long domainId;
  private String domain;

  public SiteInfo(){}

  public Long getUrlId() { return this.urlId; }
  public void setUrlId(Long urlId) { this.urlId = urlId; }
	
  public String getUrl() {  return this.url; }
  public void setUrl(String url) { this.url = url; }

  public Long getDomainId() { return this.domainId; }
  public void setDomainId(Long domainId) { this.domainId = domainId; }

  public String getDomain() { return this.domain; }
  public void setDomain(String domain) { this.domain = domain; }
}

Repository에서 위에서 정의한 조회 이름getSiteInfo을 통해 방법의 이름을 정의합니다.

Repository


@Repository
public interface SiteInfoRepository extends JpaRepository<SiteInfo, String> {
  List<SiteInfo> getSiteInfo();
}

좋은 웹페이지 즐겨찾기