JPA2.0のCriteria API

小林さんのコメントで知りましたが、JPA2.0のPublic Reviewが出ています。
PDFのダウンロードはこちら。

http://jcp.org/aboutJava/communityprocess/pr/jsr317/index.html

Public ReviewのメインはCriteria APIです。

p.192から抜粋するとCriteriaのAPIの利用例はこんな感じ。

DomainObject o = qb.createQueryDefinition(Order.class);
DomainObject p = o.join("lineItems").join("product");
p.where(p.get("productType").equal("office_supplies")).selectDistinct(o);

上記のCriteriaは次のJPQLに変換されます。

SELECT DISTINCT o
FROM Order o JOIN o.lineItems l JOIN l.product p
WHERE p.productType = ‘office_supplies’

このJPQLがさらにSQLに変換されてデータベースに発行されるわけですね。


上に書いたCriteriaのAPIの利用例のコードの前後を補足するとこんな感じ。

// qbはEntityManagerのインスタンスから取得
QueryBuilder qb = entityManager.getQueryBuilder(); 

//こっからさっきのコード
DomainObject o = qb.createQueryDefinition(Order.class);
DomainObject p = o.join("lineItems").join("product");
p.where(p.get("productType").equal("office_supplies")).selectDistinct(o);

// 問い合わせるにはQueryを作成。createQuery()に渡すのはoじゃなくてpかも
Query query = entityManager.createQuery(o);

// JPQLを実行してOrderエンティティのリストを取得
List orders = query.getResultList();