반응형
- 파라미터가 다 있을 때
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.getMemeberName())
.setMaxResults(1000) // 최대 1000건
.getResultList();
}
- 동적쿼리
1) JPQL로 처리
코드도 길고 유지보수하기 힘들다. 실무에서 안씀!
public List<Order> findAllByString(OrderSearch orderSearch) {
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();
}
2) JPA Criteria로 처리
JPA 표준 제공(JPA 스펙에 있어서 실습 진행한 것이 실무에 사용되는 것은 아니다.)
1번보다 짧아졌지만 이 코드만 봐서 무슨 쿼리가 생성되는지 모르겠음 > 유지보수가 힘들다.
public List<Order> findAllByCriteria(OrderSearch orderSearch){
//jpa 표준 제공
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Order> cq = cb.createQuery(Order.class);
Root<Order> o = cq.from(Order.class);
Join<Order, Order> 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();
}
3) Querydsl로 처리(강추!!)
JAVA 코드이기 때문에 오류가 나면 확인 가능(실수 방지)
*추후에 보충 수정 예정!
반응형
'SPRING' 카테고리의 다른 글
property or field 'orderItems' cannot be found on object of type 오류 해결 (0) | 2023.03.12 |
---|---|
DB 계정을 2개 이상 사용할 때 추가해줘야 하는 것 (0) | 2023.03.10 |
[JPA] 테스트 코드 예외 처리 작성 법 try~catch문/@Test(expected = ~) (0) | 2023.02.19 |
[JPA] 테스트 코드 ROLLBACK, COMMIT (0) | 2023.02.19 |
[JPA] Reopository EntitiyManger 의존 관계 주입 (0) | 2023.02.17 |