목차

QueryDSL

프로젝트 이관

Q-Types multi thread loading 시 dead lock

// 미리 초기화를 호출하는게 좋다. packageToLoad 를 변경해준다.
ClassPathUtils.scanPackage(Thread.currentThread().getContextClassLoader(), packageToLoad);

join 성능 향상

from(parent).innerJoin(parent.child).fetch()
....

JPA QueryDSL Cross Join 발생

JPA Subquery & JPAExpressions

Native 조건 condition

// MySQL의 TIMESTAMPDIFF를 Expression으로 만들기
 
Expressions.numberTemplate(Long.class,
  "TIMESTAMPDIFF(HOUR, {0}, {1})",
  QSomething.dateField,
  QOtherThing.anotherDateField);
 
// 이것을 메소드로 빼면 다음과 같은 형태가 된다.
public static NumberExpression<Long> hourDiff(
        Expression<? extends Date> left,
        Expression<? extends Date> right) {
    return Expressions.numberTemplate(Long.class, "TIMESTAMPDIFF(HOUR, {0}, {1})", left, right);
}

상수가 들어가는 표현식

// 0.12 - w.totalCost 를 나타내고자 한다.
Expressions.operation(Float.class, Ops.SUB, 
    Expressions.constant(0.12f), w.totalCost)
// or
NumberOperation.create(Float.class, Ops.SUB, 
    Expressions.constant(0.12f), w.totalCost)

복잡한 쿼리

Case/When

// registerDate 가 DATE 컬럼 일때
// newRegisterDate 는 LocalDateTime.class
Expression<LocalDateTime> modifyDateTime = new CaseBuilder()
    .when(qUser.registerDate.eq(expectedRegisterDate))
    .then(qUser.registerDate) // DB 입장에서 DATE 컬럼
    .otherwise(
        // DB 입장에서 DATE 인 'TO_DATE' 함수를 사용해서 변경해줌. 상수값만
        // 들어가기 때문에 어쩔 수 없이 문자로 모든 것을 넣어줌
        Expressions.dateTimeTemplate(LocalDateTime.class, "to_date({0}, {1})",
            newDateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")),
            Expressions.constant("yyyy-MM-dd HH:mm:ss"))
        );

@Embeddable의 필드 소스 생성

Metamodel 생성

참고