/////
Search
Duplicate
9️⃣

동적 인스턴스 생성

: 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
복사