• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    해결됨

상품 주문 시 주문 내역에 값이 들어가 있지 않습니다

23.02.06 18:02 작성 조회수 453

0

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

[질문 내용]
상품주문에서 submit을 누르면 다음과 같은 화면이 나옵니다.

사진과 같이 코드 48번째 줄을 추가하면 콘솔에 0이 찍힙니다.

 

H2콘솔에는 데이터가 잘 들어가 있는 것 같습니다.

 

도움 주시면 잘 읽고 해결해보도록 하겠습니다 감사합니다!!!

답변 2

·

답변을 작성해보세요.

1

OMG님의 프로필

OMG

2023.02.06

안녕하세요. workkkkk님, 공식 서포터즈 OMG입니다.

전체 프로젝트를 압축해서 구글 드라이브로 공유해서 링크를 남겨주세요.
구글 드라이브 업로드 방법은 다음을 참고해주세요.

구글 드라이브 업로드 방법 링크

주의: 업로드시 권한 문제 꼭 확인해주세요


감사합니다.

workkkkk님의 프로필

workkkkk

질문자

2023.02.10

OMG님의 프로필

OMG

2023.02.10

액세스 권한요청이 뜨네요

링크있는사용자 권한허용으로 변경해주세요

퇴근후 확인해보겠습니다

OMG님의 프로필

OMG

2023.02.10

강의코드


    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);

if (orderSearch.getOrderStatus() != null) {
    query = query.setParameter("status", orderSearch.getOrderStatus());
}
if (StringUtils.hasText(orderSearch.getMemberName())) {
    query = query.setParameter("name", orderSearch.getMemberName());
}

return query.getResultList();

직접 작성하신 코드

return em.createQuery("select o from Order o join o.member m" +
        " where o.status = :status " +
        " and m.name like :name ", Order.class)
        .setParameter("status", orderSearch.getOrderStatus())
        .setParameter("name", orderSearch.getMemberName())
        .setMaxResults(1000) //최대 1000번
        .getResultList();

 

강의에서 작성한 코드처럼 복잡하게 처리한 이유가 있는데

직접 작성하신 코드는 복잡한 상황에 대한 처리가 되어 있지 않습니다.

size를 출력했을 때 0이 나온 이유는 당연히 쿼리에서 데이터 조회를 실패해서 0이 찍힌 것이고

실패한 이유는 주문 목록 조회하는 화면에서는 검색 조건이 없는 Null 상태입니다.

image주문 목록 화면에 진입하는 시점을 생각해보면 회원명과 주문상태를 검색하지 않고 바로 화면에 들어가죠? 그렇기 때문에 null입니다.

그래서 null이 왜 문제가 되냐면

 where o.status = :status " +
        " and m.name like :name ", Order.class)

where 조건에서 주문상태가 Null이면서 회원이름이 Null(like) 을 체크 하기 때문에 where 조건에 만족하지 않아 데이터 조회를 실패하게 됩니다.

 

OMG님의 프로필

OMG

2023.02.10

제가 올린 강의코드로 findAll()을 교체하면 정상적으로 실행 확인하실 수 있을거에요.

workkkkk님의 프로필

workkkkk

질문자

2023.02.12

정상적으로 실행됩니다. 정말 감사합니다!

0

Sang-Uk Lee님의 프로필

Sang-Uk Lee

2023.02.06

Though I need more context to oroperly tackle this question, it is highly likely that orderSearch condition is set in a way query does not return the orders.

Please check what is set and what is supposed to set in the orderSearch parameter.