인프런 커뮤니티 질문&답변

김민규님의 프로필 이미지
김민규

작성한 질문수

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발

주문 목록 검색, 취소

OrderService.findOrders() 결과인 orders의 order가 orderItems를 갖지 않습니다.

해결된 질문

작성

·

524

0


[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)

[질문 내용]
주문하기에서 HTML 오류가 떠서 같은 오류의 글들을 찾아보다가 order.orderList.html의

<tr th:each="item : ${orders}">
  <td th:text="${item.id}"></td>
  <td th:text="${item.member.name}"></td>
  <td th:text="${item.orderItems[0].item.name}"></td>
  <td th:text="${item.orderItems[0].orderPrice}"></td>
  <td th:text="${item.orderItems[0].count}"></td>
  <td th:text="${item.status}"></td>
  <td th:text="${item.orderDate}"></td>
  <td>
    <a th:if="${item.status.name() == 'ORDER'}" href="#"
       th:href="'javascript:cancel('+${item.id}+')'"
       class="btn btn-danger">CANCEL</a>
  </td>
</tr>

부분에서 item.orderItems[0] 값이 있는지 확인하라는 글을 보고 OrderService.findOrders()의 결과를 디버깅하면서 확인했습니다.

같은 오류의 다른 글들 모두 확인했고, 해당 사항 없었으며, 디버깅 시 DB에는 orderItem의 값이 정상적으로 저장되는 것을 확인했습니다.

혹시나해서 OrderService.findOrders()의 내부 구현을 OrderRepository.findAllByString()과 OrderRepository.findAllByCriteria() 모두 해보았지만, 결론적으로 이 두 메서드가 반환한 orders가 orderItems을 갖지 못하는 것을 확인했습니다.

현재 야생형 커리큘럼 중이어서 위 두 메서드의 코드를 분석하기에 어려움을 겪어 질문 올립니다.

아래는 OrderRepository 소스코드입니다.

package jpabook.jpashop.repository;

import jakarta.persistence.EntityManager;
import jakarta.persistence.TypedQuery;
import jakarta.persistence.criteria.CriteriaBuilder;
import jakarta.persistence.criteria.CriteriaQuery;
import jakarta.persistence.criteria.Join;
import jakarta.persistence.criteria.JoinType;
import jakarta.persistence.criteria.Predicate;
import jakarta.persistence.criteria.Root;
import java.util.ArrayList;
import java.util.List;
import jpabook.jpashop.domain.Member;
import jpabook.jpashop.domain.Order;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Repository;
import org.springframework.util.StringUtils;

@Repository
@RequiredArgsConstructor
public class OrderRepository {

    private final EntityManager em;

    public void save(Order order) {
        em.persist(order);
    }

    public Order findOne(Long id) {
        return em.find(Order.class, id);
    }

    public List<Order> findAllByString(OrderSearch orderSearch) {
        //language=JPAQL
        String jpql = "select o From Order o join o.member m";
        boolean isFirstCondition = true; //주문 상태 검색
        if (orderSearch.getOrderStatus() != null) {
            if (isFirstCondition) {
                jpql += " where";
                isFirstCondition = false;
            } else {
                jpql += " and";
            }
            jpql += " o.status = :status";
        }

        //회원 이름 검색
        if (StringUtils.hasText(orderSearch.getMemberName())) {
            if (isFirstCondition) {
                jpql += " where";
                isFirstCondition = false;
            } else {
                jpql += " and";
            }
            jpql += " m.name like :name";
        }

        TypedQuery<Order> query = em.createQuery(jpql, Order.class)
                .setMaxResults(1000); //최대 1000건
        if (orderSearch.getOrderStatus() != null) {
            query = query.setParameter("status", orderSearch.getOrderStatus());
        }
        if (StringUtils.hasText(orderSearch.getMemberName())) {
            query = query.setParameter("name", orderSearch.getMemberName());
        }
        List<Order> orders = query.getResultList();
        return orders;
    }

    public List<Order> findAllByCriteria(OrderSearch orderSearch) {
        CriteriaBuilder cb = em.getCriteriaBuilder();
        CriteriaQuery<Order> cq = cb.createQuery(Order.class);
        Root<Order> o = cq.from(Order.class);
        Join<Order, Member> m = o.join("member", JoinType.INNER);
        //회원과 조인

        List<Predicate> criteria = new ArrayList<>();

        //주문 상태 검색
        if (orderSearch.getOrderStatus() != null) {
            Predicate status = cb.equal(o.get("status"), orderSearch.getOrderStatus());
            criteria.add(status);
        }

        //회원 이름 검색
        if (StringUtils.hasText(orderSearch.getMemberName())) {
            Predicate name =
                cb.like(m.<String>get("name"), "%" + orderSearch.getMemberName() + "%");
            criteria.add(name);
        }
        cq.where(cb.and(criteria.toArray(new Predicate[criteria.size()])));
        TypedQuery<Order> query = em.createQuery(cq).setMaxResults(1000); //최대 1000건
        List<Order> orders = query.getResultList();
        return orders;
    }



}

 

답변 1

0

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. 김민규님

제공해드리는 강의 소스 코드와 비교해보시고 그래도 문제를 해결할 수 없으면

전체 프로젝트를 압축해서 구글 드라이브로 공유해서 링크를 남겨주세요.

구글 드라이브 업로드 방법은 다음을 참고해주세요.

https://bit.ly/3fX6ygx

주의: 업로드시 링크에 있는 권한 문제 꼭 확인해주세요

추가로 다음 내용도 코멘트 부탁드립니다.

1. 실행 방법을 알려주세요.

2. 어떻게 문제를 확인할 수 있는지 자세한 설명을 남겨주세요.

감사합니다.

김민규님의 프로필 이미지
김민규

작성한 질문수

질문하기