사용자 도구

사이트 도구


java:querydsl

문서의 이전 판입니다!


QueryDSL

JPA QueryDSL Cross Join 발생

  • Parent - Child가 1:1 관계일 때 다음과 같이 쿼리했더니 inner join과 cross join이 함께 발생했다.
    QParent parent = QParent.parent;
    QChild child = parent.child;
     
    from(parent).innerJoin(parent.child).fetch()
        .where(parent.something.gt(parent.child.somthing))....;
  • 다음처럼 innerJoin에 PATH를 지정했더니 cross join이 사라졌다.
    QParent parent = QParent.parent;
    QChild child = QChild.child; // 여기 달라짐
     
    from(parent).innerJoin(parent.child, child).fetch() // as 처리가 필요함.
        .where(parent.something.gt(child.somthing))....;

Native 조건 condition

  • ExpressionsxxxTemplate를 통해서 native 쿼리 조건을 만들어 낼 수 있다.
// 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)

복잡한 쿼리

  • 복잡한 쿼리는 BooleanBuilder를 사용한다.
    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);
    }

참고

java/querydsl.1421292108.txt.gz · 마지막으로 수정됨: 2015/01/15 12:21 저자 kwon37xi