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

workkkkk님의 프로필 이미지

작성한 질문수

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

상품 주문

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

해결된 질문

작성

·

581

0

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

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

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

 

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

 

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

답변 2

1

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

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

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

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


감사합니다.

workkkkk님의 프로필 이미지
workkkkk
질문자

액세스 권한요청이 뜨네요

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

퇴근후 확인해보겠습니다

강의코드


    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 조건에 만족하지 않아 데이터 조회를 실패하게 됩니다.

 

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

workkkkk님의 프로필 이미지
workkkkk
질문자

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

0

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.

workkkkk님의 프로필 이미지

작성한 질문수

질문하기