jpashop : search (dynamic query)
This commit is contained in:
@@ -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<Order> findAll(OrderSearch orderSearch) {}
|
||||
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());
|
||||
}
|
||||
return query.getResultList();
|
||||
}
|
||||
|
||||
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건
|
||||
return query.getResultList();
|
||||
}
|
||||
|
||||
public List<Order> 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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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]
|
||||
}
|
||||
Reference in New Issue
Block a user