Hi.

Some comments on the Querydsl aspects :
Attendees: Michelle Caisse, Michael Bouschen, Craig Russell

Agenda:

1. JDOQL & Querydsl: looks interesting, along the lines of JPA except JPA uses Java 6 APT whereas it looks like Querydsl uses a static preprocessor. Not much of a difference; Querydsl could use the APT approach as well. The big advantage in both approaches is compile-time checking.
Querydsl uses Java 6 APT. But we provide support for Java 5 APT as well.


Looks simple at first glance. But what does it look like with more complex queries like joins, projections, collection navigation, maps, subselects, etc.? How well does it cover the JDOQL query space?
Collection and Map navigation is supported, and subselects are at least supported in the JPAQL/HQL module, haven't tested it with JDOQL.

Examples of more complex queries will be in the tests and documentation of the next release.


Here is a comparison of queries I posted on Linda de Michiel's JPA 2 blog (http://blogs.sun.com/ldemichiel/entry/java_persistence_2_0_proposed#comments) :

JPA 2 query :

QueryBuilder qb = ...
CriteriaQuery q = qb.create();
Root<Customer> cust = q.from(Customer.class);
Join<Customer, Order> order = cust.join(Customer_.orders);
Join<Order, Item> item = order.join(Order_.lineitems);
q.select(cust.get(Customer_.name))
 .where(qb.equal(item.get(Item_.product).get(Product_.productType),"printer"));


Querydsl query (for HQL) :
HQLQuery query = new HQLQueryImpl(session);
QCustomer cust = QCustomer.customer; QOrder order = QOrder.order; QLineItem lineItem = QLineItem.lineItem;

List<String> customerNames = query.from(cust) .innerJoin(cust.orders, order)
 .innerJoin(order.lineitems, lineItem)
 .where(lineItem.product.productType.eq("printer"))
.list(cust.name);
(QCustomer, QOrder and QLineItem are Querydsl metamodel types, they are 
immutable and can be reused over queries)


JPAQL query :

SELECT c.name
FROM Customer c JOIN c.orders o JOIN o.lineitems i
WHERE i.product.productType = 'printer'


Compare the filter expression of JPA 2

 qb.equal(item.get(Item_.product).get(Product_.productType),"printer")

with the Querydsl version

lineItem.product.productType.eq("printer")

Br,
Timo Westkämper / Mysema Ltd

Reply via email to