문서의 이전 판입니다!
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))....;
xxxTemplate
를 통해서 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); }
Expressions.constant(객체)
는 Java 객체를 그에 맞는 JDBC 객체로 변환해준다.// 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); }