개발 순서 리마인드 : 엔티티 -> 레포지토리 -> 서비스
📍
public void save(Item item) {
if (item.getId() == null) { // 새로운 회원일 때
em.persist(item);
}
else { // DB에 이미 저장된 엔티티 '수정'
em.merge(item);
}
}
상품 도메인 개발과 방법이 유사함.
1) 검색 조건으로 파라미터에 OrderSearch 클래스를 추가한다.
package jpabook.jpashop.domain;
public class OrderSearch {
private String memberName; //회원 이름
private OrderStatus orderStatus;//주문 상태[ORDER, CANCEL] //Getter, Setter
}
그 다음, 리포지토리 클래스에 코드 추가 !
public List<Order> findAll(OrderSearch orderSearch) {
//... 검색 로직
}
2) JPA Criteria로 처리
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();
}
실무에서 쓰기엔 너무 복잡함. -> Querydsl 사용 !