문서의 선택한 두 판 사이의 차이를 보여줍니다.
양쪽 이전 판 이전 판 다음 판 | 이전 판 다음 판 양쪽 다음 판 | ||
java:querydsl [2014/12/30 15:22] kwon37xi [상수가 들어가는 표현식] |
java:querydsl [2020/07/31 10:19] kwon37xi [Case/When] |
||
---|---|---|---|
줄 1: | 줄 1: | ||
====== QueryDSL ====== | ====== QueryDSL ====== | ||
* http:// | * http:// | ||
+ | * [[java: | ||
+ | * [[java: | ||
+ | * [[http:// | ||
* Querydsl is a framework which enables the construction of type-safe SQL-like queries for multiple backends including JPA, JDO and SQL in Java. | * Querydsl is a framework which enables the construction of type-safe SQL-like queries for multiple backends including JPA, JDO and SQL in Java. | ||
+ | |||
+ | ===== Q-Types multi thread loading 시 dead lock ===== | ||
+ | * [[http:// | ||
+ | <code java> | ||
+ | // 미리 초기화를 호출하는게 좋다. packageToLoad 를 변경해준다. | ||
+ | ClassPathUtils.scanPackage(Thread.currentThread().getContextClassLoader(), | ||
+ | </ | ||
+ | |||
+ | ===== join 성능 향상 ===== | ||
+ | * Join 시 그 결과로 나오는 관계 객체를 Eager Loading 하려면 '' | ||
+ | |||
+ | <code java> | ||
+ | from(parent).innerJoin(parent.child).fetch() | ||
+ | .... | ||
+ | </ | ||
===== JPA QueryDSL Cross Join 발생 ===== | ===== JPA QueryDSL Cross Join 발생 ===== | ||
줄 18: | 줄 36: | ||
.where(parent.something.gt(child.somthing))....; | .where(parent.something.gt(child.somthing))....; | ||
</ | </ | ||
+ | |||
+ | ===== JPA Subquery & JPAExpressions ===== | ||
+ | * JPA Subquery 는 '' | ||
+ | * SELECT 에서 사용할 때는 '' | ||
===== Native 조건 condition ===== | ===== Native 조건 condition ===== | ||
* [[http:// | * [[http:// | ||
+ | * JPA 사용시에는 해당 함수가 [[java: | ||
<code java> | <code java> | ||
+ | // MySQL의 TIMESTAMPDIFF를 Expression으로 만들기 | ||
+ | |||
Expressions.numberTemplate(Long.class, | Expressions.numberTemplate(Long.class, | ||
" | " | ||
QSomething.dateField, | QSomething.dateField, | ||
QOtherThing.anotherDateField); | QOtherThing.anotherDateField); | ||
+ | | ||
+ | // 이것을 메소드로 빼면 다음과 같은 형태가 된다. | ||
+ | public static NumberExpression< | ||
+ | Expression<? | ||
+ | Expression<? | ||
+ | return Expressions.numberTemplate(Long.class, | ||
+ | } | ||
</ | </ | ||
+ | * [[https:// | ||
===== 상수가 들어가는 표현식 ===== | ===== 상수가 들어가는 표현식 ===== | ||
* [[http:// | * [[http:// | ||
+ | * **'' | ||
<code java> | <code java> | ||
// 0.12 - w.totalCost 를 나타내고자 한다. | // 0.12 - w.totalCost 를 나타내고자 한다. | ||
줄 39: | 줄 73: | ||
</ | </ | ||
- | ====== | + | ===== 복잡한 쿼리 |
+ | * 복잡한 쿼리는 '' | ||
+ | public List< | ||
+ | QCustomer customer = QCustomer.customer; | ||
+ | HibernateQuery qry = new HibernateQuery(session).from(customer); | ||
+ | BooleanBuilder builder = new BoolenBuilder(); | ||
+ | for (String name : names){ | ||
+ | builder.or(customer.name.eq(name)); | ||
+ | } | ||
+ | qry.where(builder); | ||
+ | return qry.list(customer); | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | ===== Case/When ===== | ||
+ | * [[https:// | ||
+ | * '' | ||
+ | * '' | ||
+ | * 따라서, '' | ||
+ | |||
+ | <code java> | ||
+ | // registerDate 가 DATE 컬럼 일때 | ||
+ | // newRegisterDate 는 LocalDateTime.class | ||
+ | Expression< | ||
+ | .when(qUser.registerDate.eq(expectedRegisterDate)) | ||
+ | .then(qUser.registerDate) // DB 입장에서 DATE 컬럼 | ||
+ | .otherwise( | ||
+ | // DB 입장에서 DATE 인 ' | ||
+ | // 들어가기 때문에 어쩔 수 없이 문자로 모든 것을 넣어줌 | ||
+ | Expressions.dateTimeTemplate(LocalDateTime.class, | ||
+ | newDateTime.format(DateTimeFormatter.ofPattern(" | ||
+ | Expressions.constant(" | ||
+ | ); | ||
+ | </ | ||
+ | ===== @Embeddable의 필드 소스 생성 ===== | ||
+ | * Embeddable안에 또 다른 Embeddable이 있을 경우, 더 자식쪽 Embeddable의 경우 명시적 컬럼 매핑('' | ||
+ | * 버그로 보인다. | ||
+ | |||
+ | ==== Metamodel 생성 ==== | ||
+ | * [[gradle: | ||
+ | * [[gradle: | ||
+ | * Java 7에서 '' | ||
+ | Caused by: java.lang.NullPointerException | ||
+ | at com.mysema.query.codegen.SimpleSerializerConfig.getConfig(SimpleSerializerConfig.java: | ||
+ | at com.mysema.query.apt.DefaultConfiguration.< | ||
+ | at com.mysema.query.apt.jpa.JPAConfiguration.< | ||
+ | ... | ||
+ | </ | ||
+ | |||
+ | |||
+ | ===== 참고 | ||
* [[http:// | * [[http:// | ||
* [[http:// | * [[http:// | ||
* [[http:// | * [[http:// | ||
* [[http:// | * [[http:// | ||
+ | * [[https:// |