본문 바로가기
MySql

MySQL JPA- 엔티티가 아닌 클래스의 두 테이블 결합

by 베이스 공부 2020. 12. 2.
반응형

나는 초보자이고 Google에 시도했지만 내 쿼리를 해결할 수 없습니다. 도와주세요.

POJO 클래스 PersonC의 PersonA와 Person의 두 엔티티를 매핑하려고합니다.

@Entity
class PersonA{
     String sample_field;
}

@Entity
class Person{
     String id;
     String name;

}

위의 두 개는 jpa의 엔티티입니다.

이제 하나의 pojo 클래스로 병합하고 싶습니다.

class PersonC
{
   Strind id;
   String address;
}

아래 코드를 시도했지만 주소 / 외래 키 필드를 가져 오려고하면 작동하지 않습니다.

@SqlResultSetMapping(name="PersonC", 
classes = {
   @ConstructorResult(targetClass = PersonC.class, 
    columns = {@ColumnResult(name="name")
              , @ColumnResult(name="address")
    )}

위의 클래스에 대해 @SqlResultSetMapping을 어디에서 정의해야합니까? ) })

 

해결 방법

 

@SqlResultSetMapping 모든 엔티티 클래스에 배치 할 수 있습니다 (POJO에 주석을 달지 마십시오. 작동하지 않음). @ConstructorResult 를 사용하여 POJO 클래스에 매핑은 JPA 버전 2.1에서 추가되었습니다. 매핑과 함께 사용되는 POJO에는 올바른 생성자가 있어야합니다.

의도 된 생성자의 인수에 해당하는 모든 열은 생성자의 인수 목록과 동일한 순서로 ConstructorResult 주석의 columns 요소를 사용하여 지정되어야합니다.

쿼리 사용과 함께 다음 예제를 참조하고 그에 따라 사례를 해결하십시오.

@Entity
public class Address {
    @Id int id;  
    String street;
}


@SqlResultSetMapping(name="PersonDTOMapping",
    classes = {
     @ConstructorResult(targetClass = PersonDTO.class,
       columns = {@ColumnResult(name="name"), @ColumnResult(name="street")}
     )}
)
@Entity
public class Person {
    @Id int id;
    String name;
    Address address;  
}  

public class PersonDTO {
    String name;
    String street;
    public PersonDTO(String name, String street) {
        this.name = name;
        this.street = street;
    }
}

// usage
Query query = em.createNativeQuery(
    "SELECT p.name AS name, a.street AS street FROM Person p, Address a WHERE p.address_id=a.id",
    "PersonDTOMapping");
List<PersonDTO> result = query.getResultList();

별칭 ( AS name AS street )은 @ColumnResult 의 이름과 일치해야합니다. 예제는 Ecliselink 2.5.1에 ​​대해 테스트되었습니다.

 

참조 페이지 https://stackoverflow.com/questions/25179180

 

 

반응형

댓글