사용자 도구

사이트 도구


java:querydsl

차이

문서의 선택한 두 판 사이의 차이를 보여줍니다.

차이 보기로 링크

양쪽 이전 판 이전 판
다음 판
이전 판
java:querydsl [2015/01/13 15:21]
kwon37xi [Native 조건 condition]
java:querydsl [2019/03/30 21:37] (현재)
kwon37xi
줄 1: 줄 1:
 ====== QueryDSL ====== ====== QueryDSL ======
   * http://​www.querydsl.com/​   * http://​www.querydsl.com/​
 +  * [[java:​jpa|JPA]] 쿼리를 더 편리하게 생성할 수도 있고
 +  * [[java:​querydsl:​nativesql|QueryDSL Native SQL]]로 Native SQL도 생성 가능하다.
 +  * [[http://​www.querydsl.com/​static/​querydsl/​latest/​reference/​html/​|QueryDSL Reference]]
   * 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://​www.querydsl.com/​static/​querydsl/​3.2.2/​reference/​html/​ch04s02.html|4.2. Multithreaded initialization of Querydsl Q-types]]
 +<code java>
 +// 미리 초기화를 호출하는게 좋다. packageToLoad 를 변경해준다.
 +ClassPathUtils.scanPackage(Thread.currentThread().getContextClassLoader(),​ packageToLoad);​
 +</​code>​
 +
 +===== join 성능 향상 =====
 +  * Join 시 그 결과로 나오는 관계 객체를 Eager Loading 하려면 ''​fetch()''​ 를 사용해야 한다.
 +
 +<code java>
 +from(parent).innerJoin(parent.child).fetch()
 +....
 +</​code>​
  
 ===== JPA QueryDSL Cross Join 발생 ===== ===== JPA QueryDSL Cross Join 발생 =====
줄 18: 줄 36:
     .where(parent.something.gt(child.somthing))....;​     .where(parent.something.gt(child.somthing))....;​
 </​code>​ </​code>​
 +
 +===== JPA Subquery & JPAExpressions =====
 +  * JPA Subquery 는 ''​JPAExpressions.select''​ 를 이용하여 각종 Sub Query 생성가능.
 +  * SELECT 에서 사용할 때는 ''​ExpressionUtils.as([subquery])''​ 로 묶어준다.
  
 ===== Native 조건 condition ===== ===== Native 조건 condition =====
   * [[http://​www.querydsl.com/​static/​querydsl/​latest/​apidocs/​com/​mysema/​query/​support/​Expressions.html|Expressions]]의 ''​xxxTemplate''​를 통해서 native 쿼리 조건을 만들어 낼 수 있다.   * [[http://​www.querydsl.com/​static/​querydsl/​latest/​apidocs/​com/​mysema/​query/​support/​Expressions.html|Expressions]]의 ''​xxxTemplate''​를 통해서 native 쿼리 조건을 만들어 낼 수 있다.
 <code java> <code java>
 +// MySQL의 TIMESTAMPDIFF를 Expression으로 만들기
 +
 Expressions.numberTemplate(Long.class,​ Expressions.numberTemplate(Long.class,​
   "​TIMESTAMPDIFF(HOUR,​ {0}, {1})",   "​TIMESTAMPDIFF(HOUR,​ {0}, {1})",
줄 47: 줄 71:
 </​code>​ </​code>​
  
-====== 참고 ======+===== 복잡한 쿼리 ​===== 
 +  * 복잡한 쿼리는 ''​BooleanBuilder''​를 사용한다.<​code java> 
 +public List<​Customer>​ getCustomer(String... names){ 
 +    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);​ // customer.name eq name1 OR customer.name eq name2 OR ...   
 +    return qry.list(customer);​ 
 +
 +</​code>​ 
 + 
 +===== Case/When ===== 
 +  * [[https://​jojoldu.tistory.com/​401|[Querydsl] Case When 사용하기]] 
 +  * ''​CaseBuilder''​ 사용. 
 + 
 +===== @Embeddable의 필드 소스 생성 ===== 
 +  * Embeddable안에 또 다른 Embeddable이 있을 경우, 더 자식쪽 Embeddable의 경우 명시적 컬럼 매핑(''​@Column''​)이 없으면 모델 소스 (Q*) 생성시에 더 자식쪽 Embeddable의 필드에 대한 모델 소스가 올바르게 생성되지 않았다. 
 +  * 버그로 보인다. 
 + 
 +==== Metamodel 생성 ==== 
 +  * [[gradle:​jpa_metamodel_generation|Gradle에서 JPA 2 MetaModel 생성]] ​조. 
 +  * [[gradle:​querydsl_native_sql_codegen|Gradle 에서 Native SQL Code Generation]] 참조. 
 +  * Java 7에서 ''​SimpleSerializerConfig.getConfig''​에서 ''​NullPointerException''​ 발생하는 경우가 있는데 이는 QueryDSL과 아무 상관 없는 코드 중에 의존성에 들어가지 않는 Annotation을 넣은게 있었기 때문이었다(Java 8에서는 올바른 컴파일 오류 지점이 보였음).<​code>​ 
 +Caused by: java.lang.NullPointerException 
 + at com.mysema.query.codegen.SimpleSerializerConfig.getConfig(SimpleSerializerConfig.java:​29) 
 + at com.mysema.query.apt.DefaultConfiguration.<​init>​(DefaultConfiguration.java:​137) 
 + at com.mysema.query.apt.jpa.JPAConfiguration.<​init>​(JPAConfiguration.java:​54) 
 + ... 
 +</​code>​ 
 + 
 + 
 +===== 참고 ​=====
   * [[http://​www.javacodegeeks.com/​2013/​05/​jpa-querydsl-projections.html|JPA - Querydsl Projections]]   * [[http://​www.javacodegeeks.com/​2013/​05/​jpa-querydsl-projections.html|JPA - Querydsl Projections]]
   * [[http://​www.youtube.com/​playlist?​list=PLHETc3O85eXLvYt6lqex4kVBdMjjY9fLb|김영한님의 QueryDSL 소개 동영상]]   * [[http://​www.youtube.com/​playlist?​list=PLHETc3O85eXLvYt6lqex4kVBdMjjY9fLb|김영한님의 QueryDSL 소개 동영상]]
   * [[http://​luisfpg.blogspot.kr/​2013/​02/​the-beauty-of-querydsl-in-sorting.html|Free IT / Luis Fernando Planella Gonzalez: The beauty of Querydsl: calling database functions]] 사용자 정의 함수 호출 기법   * [[http://​luisfpg.blogspot.kr/​2013/​02/​the-beauty-of-querydsl-in-sorting.html|Free IT / Luis Fernando Planella Gonzalez: The beauty of Querydsl: calling database functions]] 사용자 정의 함수 호출 기법
   * [[http://​blog.mysema.com/​2011/​08/​querydsl-in-wild.html|Mysema Blog: Querydsl in the wild]]   * [[http://​blog.mysema.com/​2011/​08/​querydsl-in-wild.html|Mysema Blog: Querydsl in the wild]]
 +  * [[https://​examples.javacodegeeks.com/​enterprise-java/​spring/​spring-querydsl-tutorial/​|Spring Querydsl Tutorial]]
java/querydsl.1421130115.txt.gz · 마지막으로 수정됨: 2015/01/13 15:21 저자 kwon37xi