: JPA는 쿼리 결과에서 임의의 객체를 동적으로 생성할 수 있는 기능을 제공하고 있다.
public interface OrderSummaryDao extends Repository<OrderSummary, String> {
@Query("""
select new com.myshop.order.query.dto.OrderView(
o.number, o.state, m.name, m.id, p.name
)
from Order o join o.orderLines ol, Member m, Product p
where o.orderer.memberld.id = :ordererld
and o.orderer.memberld.id = m.id
and index(ol) = 0
and ol.productld.id = p.id
order by o.number.number desc
""")
List<OrderView> findOrderView(String ordererld);
Java
복사
: 이 코드에서 JPQL의 select 절을 보면 new 키워드가 있다. new 키워드 뒤에 생성할 인스턴스의 완전한 클래스 이름을 지정하고 괄호 안에 생성자에 인자로 전달할 값을 지정한다.
: 이 코드는 OrderView 생성자에 인자로 각각 Order의 number, Member의 name 등 필요한 값을 전달한다. OrderView 생성자는 생성자로 전달받은 데이터를 저장한다.
: 표현영역을 통해 사용자에게 데이터를 보여주기 위해 조회 전용 모델을 만든다.
: 밸류타입을 원하는 형식으로 출력하도록 프레임워클르 확장해서 조회 전용 모델에서 밸류 타입의 의미가 사라지지 않도록 할 수 있다.
public class Orderview {
private final String number;
private final Orderstate state; // 밸류타입
private final String memberName;
private final String memberld;
private final String productName;
public OrderView(OrderNo number, Orderstate state. String memberName, Memberld memberld, String productName) {
this.number = number.getNumber();
this.state = state;
this.memberName = memberName;
this.memberld = memberld.getld();
this.productName = productName;
}
... // get 메서드
}
Java
복사