// 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); //최대 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();
}
// QueryDSL
public List<Order> findAll(OrderSearch orderSearch) {
QOrder order = QOrder.order;
QMember member = QMember.member;
return query
.select(order)
.from(order)
.join(order.member, member)
.where(statusEq(orderSearch.getOrderStatus()),
nameLike(orderSearch.getMemberName()))
.limit(1000)
.fetch();
}
private BooleanExpression statusEq(OrderStatus statusCond) {
if (statusCond == null) {
return null;
}
return order.status.eq(statusCond);
}
private BooleanExpression nameLike(String nameCond) {
if (!StringUtils.hasText(nameCond)) {
return null;
}
return member.name.like(nameCond);
}
DB PK (Primery key) 특성
- PK는 레코드(Table의 row)의 위치를 결정하므로 신중하게 결정해야함
- PK가 유사한 레코드끼리 묶어서 저장 => 클러스터링이라고 말함
(PK를 클러스터 인덱스라고 칭함. 일반 인덱스는 논클러스터 인덱스) - 이러한 특정으로 레코드 저장 또는 PK 변경 처리 속도가 느리다
- 우선 레코드를 추가하기 위해 PK 기반으로 저장 위치를 탐색하고, PK변경을 위해서는 레코드가 저장된 물리적 위치를 변경하는 작업이 수반되기에 처리 속도가 느릴 수 밖에 없음
728x90
'ssung_항해일지 > 항해99_실전 프로젝트' 카테고리의 다른 글
실전 프로젝트 - 14일차 (0) | 2023.03.24 |
---|---|
실전 프로젝트 - 13일차 (0) | 2023.03.22 |
실전 프로젝트 - 11일차 (0) | 2023.03.20 |
실전 프로젝트 - 9일차 (0) | 2023.03.19 |
실전 프로젝트 - 8일차 (0) | 2023.03.17 |