From 2141af1c6d395584b557a473d6f9fa0fe12254e7 Mon Sep 17 00:00:00 2001 From: kim Date: Mon, 25 Jan 2021 15:48:22 +0900 Subject: [PATCH] jpashop : search (dynamic query) --- .../jpashop/repository/OrderRepository.java | 75 ++++++++++++++++++- .../jpashop/repository/OrderSearch.java | 12 +++ 2 files changed, 86 insertions(+), 1 deletion(-) create mode 100644 jpashop/src/main/java/com/example/jpashop/repository/OrderSearch.java diff --git a/jpashop/src/main/java/com/example/jpashop/repository/OrderRepository.java b/jpashop/src/main/java/com/example/jpashop/repository/OrderRepository.java index 2c515df7..2ecc223b 100644 --- a/jpashop/src/main/java/com/example/jpashop/repository/OrderRepository.java +++ b/jpashop/src/main/java/com/example/jpashop/repository/OrderRepository.java @@ -1,10 +1,15 @@ package com.example.jpashop.repository; +import com.example.jpashop.domain.Member; import com.example.jpashop.domain.Order; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Repository; +import org.springframework.util.StringUtils; import javax.persistence.EntityManager; +import javax.persistence.TypedQuery; +import javax.persistence.criteria.*; +import java.util.ArrayList; import java.util.List; @Repository @@ -21,5 +26,73 @@ public class OrderRepository { return em.find(Order.class, id); } -// public List findAll(OrderSearch orderSearch) {} + public List 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 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()); + } + return query.getResultList(); + } + + public List findAllByCriteria(OrderSearch orderSearch) { + CriteriaBuilder cb = em.getCriteriaBuilder(); + CriteriaQuery cq = cb.createQuery(Order.class); + Root o = cq.from(Order.class); + Join m = o.join("member", JoinType.INNER); //회원과 조인 + List 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.get("name"), "%" + + orderSearch.getMemberName() + "%"); + criteria.add(name); + } + cq.where(cb.and(criteria.toArray(new Predicate[criteria.size()]))); + TypedQuery query = em.createQuery(cq).setMaxResults(1000); //최대 1000건 + return query.getResultList(); + } + + public List findAll(OrderSearch orderSearch) { + + 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(); + } } diff --git a/jpashop/src/main/java/com/example/jpashop/repository/OrderSearch.java b/jpashop/src/main/java/com/example/jpashop/repository/OrderSearch.java new file mode 100644 index 00000000..ac254e58 --- /dev/null +++ b/jpashop/src/main/java/com/example/jpashop/repository/OrderSearch.java @@ -0,0 +1,12 @@ +package com.example.jpashop.repository; + +import com.example.jpashop.domain.OrderStatus; +import lombok.Getter; +import lombok.Setter; + +@Getter @Setter +public class OrderSearch { + + private String memberName; // 회원 이름 + private OrderStatus orderStatus; // 주문상태 [ORDER, CANCEL] +}