주문에 대한 검색을 개발 하기 앞서
OrderSearch 라는 객체 클래스를 만들어준다
OrderSearch는 회원명과 주문 상태만을 가지고 있는다.
@Getter @Setter
public class OrderSearch {
private String memberName;
private OrderStatus orderStatus;
}
그리고 OrderRepository에서 주문 목록을 받는 리스트 형식의 findAllByString 메서드를 만들어준다.
findAllByString은 OrderSearch를 매게변수로 받아 쿼리문을 생성해 리스트 형식으로 가져오게 된다.
public List<Order> findAllByString(OrderSearch orderSerach){
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",orderSerach.getOrderStatus())
.setParameter("name",orderSerach.getMemberName())
.setMaxResults(1000)
.getResultList();
}
하지만 이렇게 만든 메서드는 status와 name이라는 동적쿼리가 꼭 존재할때만 사용이 가능하다.
그래서 동적 쿼리를 사용하기 위한 메서드를 작성했다.
public List<Order> findAllByString(OrderSearch orderSerach){
//동적 쿼리 생성
String jpql = "select o from Order o join o.member m";
boolean isFirstCondition = true;
//주문 상태 검색
if(orderSerach.getOrderStatus() != null){
if(isFirstCondition){
jpql += " where";
isFirstCondition = false;
}else {
jpql += " and";
}
jpql += " o.status = :status";
}
//회원 이름 검색
if(StringUtils.hasText(orderSerach.getMemberName())){
if(isFirstCondition){
jpql += " where";
isFirstCondition = false;
}else {
jpql += " and";
}
jpql += " o.status = :status";
}
TypedQuery<Order> query = em.createQuery(jpql, Order.class).setMaxResults(1000);
if(orderSerach.getOrderStatus() != null){
query = query.setParameter("status",orderSerach.getOrderStatus());
}
if(StringUtils.hasText(orderSerach.getMemberName())){
query = query.setParameter("name",orderSerach.getMemberName());
}
List<Order> resultList = query.getResultList();
return resultList;
}
동적 쿼리로 생성을 하여 OrderStatus와 MemberName이 존재할 때는 추가되고, 만약 하나만 존재해도 where 절이 추가 되어 쿼리문이 작성 될 수 있게 만들었다.
번외로 JPA Criteria 쿼리도 보여줬는데, 유지보수가 너무 힘들어 사용하지는 않는다고 한다.
추후에 QueryDSL 로 대체를 할 수 있다고 한다.
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<Object, Object> 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.equal(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);
return query.getResultList();
}
강의 : 인프런 실전! 스프링 부트와 JPA 활용1 (김영한) https://inf.run/VMWU
'Study > 실전! 스프링 부트와 JPA 활용1' 카테고리의 다른 글
상품 관리 기능 개발 (0) | 2022.07.20 |
---|---|
회원 관리 기능 개발 (0) | 2022.07.20 |
주문 개발 4 (OrderService Test) (0) | 2022.07.15 |
주문 개발 3 (OrderService- 주문 개발) (0) | 2022.07.15 |
주문 개발 2 (Order- 주문 개발) (0) | 2022.07.14 |
댓글