> For the complete documentation index, see [llms.txt](https://heunnajo.gitbook.io/jpa-2-api/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://heunnajo.gitbook.io/jpa-2-api/4.-api/v1.md).

# 주문 조회 V1: 엔티티 직접 노출

주문 내역에서 **주문한 상품 정보**를 추가로 조회해본다.\
Order 기준으로 컬렉션인 **OrderItem**, **Item** 이 필요하다.\
Order->OrderItem->Item : 아이템 이름 출력\
\=>**주문한 내역**과 **주문한 상품명(주문상품.getName)** 함께 출력해본다.

```java
List<OrderItem> orderItems = order.getOrderItems();
orderItems.stream().forEach(o -> o.getItem().getName());
```

**Hibernate5Module**는 지연로딩해서 프록시 객체는 초기화해서 초기화된 프록시 객체만 반환한다.\
**조회하려는 객체가 지연로딩(LAZY)이면 프록시 객체 강제 초기화**해서 **진짜 엔티티 데이터를 가져온다!**\
Hibernate는 지연로딩인 애들은 데이터를 안 뿌린다. 하지만 강제 초기화된 프록시객체들은 뿌린다!\
단, **양방향 관계들은 한쪽에 @JsonIgnore를 붙여서 무한 루프에 빠지지 않도록 한다!**\
ex) Member->Team->List\<Member><br>

**알고리즘 순서**

1. Order 엔티티(List\<Order>) 조회 : orderRepository에서 데이터 모두 가져온다.
2. 1의 List\<Order>에서 각각의 Order 객체의 데이터 조회\
   ① 주문 회원 이름\
   ② 배송지 정보\
   ③ 주문 상품들 => stream과 foreach문을 이용해서 주문한 상품들(List\<OrderItem>) 컬렉션에서 각 주문 상품(OrderItem)의 상품명 조회

1\. 람다식 표현 사용

```java
@GetMapping("/api/v1/orders")
    public List<Order> ordersV1() {
        List<Order> all = orderRepository.findAllByCriteria(new OrderSearch());
        //프록시 객체에 접근하여 강제 초기화.
        for (Order order : all) {
            order.getMember().getName();
            order.getDelivery().getAddress();
            List<OrderItem> orderItems = order.getOrderItems();
            orderItems.stream().forEach(o -> o.getItem().getName());
        }
        return all;
    }
```

2\. for문 표현

```java
@GetMapping("/api/v1/orders")
    public List<Order> ordersV1() {
        List<Order> all = orderRepository.findAllByCriteria(new OrderSearch());
        //프록시 객체에 접근하여 강제 초기화.
        for (Order order : all) {
            order.getMember().getName();
            order.getDelivery().getAddress();

            List<OrderItem> orderItems = order.getOrderItems();
            for (OrderItem orderItem : orderItems) {//위 표현이 더 가독성이 좋은 람다식.
                orderItem.getItem().getName();
            }
        }
        return all;
    }
```
