JPQLの微妙なところでeclipse-linkとHibernateを比べてみる

JPQLでこんなのを書いてみました。

select p1, p2 from Product as p1, Product as p2 where p1.name = p2.name

戻り値は2つのエンティティ。

戻り値の結果
  • ElipseLink2.4.0

  • Hibernate4.1.9.Final


結果は、両方共Listで帰ってきて、その下にObjectの配列[p1,p2]が入っていました。
これを使うとしたらキャストが必要になるなぁ。
なんとなく微妙です。

そして、なぜEclipseLinkはVectorで返す・・・・・


追記:
[twitter:@shinsan68k]さんに教えて頂きましたが、エンティティを引数にしたNEW句が書けるみたいです。

select new megascus.Products(p1, p2) from Product as p1, Product as p2 where p1.name = p2.name
public class Products {

    List<Product> p;
    
    public Products(Product p1, Product p2) {
        this.p = Arrays.asList(new Product[]{p1, p2});
    }
}

※コンストラクタの引数を可変長引数にしてみたら双方ともエラーになりました。

追記2:
Hibernateでは以下の様なDelete文を受け付けてくれました。

Delete Product

これはJPQLとしては間違っていて、以下のように書く必要があります。

Delete from Product

微妙なところで、可搬性に難があるなぁ。