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();