2011-01-20 20 views
2

:この時点でJPAの回避クエリ

StringBuilder jpaQuery = new StringBuilder(); 

StringBuilder whereClause = new StringBuilder(); 

jpaQuery.append("SELECT o, o.currencyEntity"); 

List orders = query.getResultList(); 

JPAのログは、テーブルとに他を注文するために実行される2つのquerys、1を表示します通貨テーブル。

は、私は次のコード(前のコードの同じクラス及びメソッドで)

for (Object orderElement : orders) { 

    int indexArray = 0; 
    Object[] orderArray = (Object[]) orderElement; 
    Order orderEntity = (Order) orderArray [indexArray++]; 
    orderEntity.setCurrencyEntity((Currency) orderArray [indexArray++]); 

} 

orderEntity.setCurrencyEntity((Currency) orderArray [indexArray++]); 

が実行されると、テーブル通貨上クエリが実行される書き込みベローズもう一度データベースで。私はいくつかのパフォーマンスの問題を修正するためにこのクエリを避ける必要がある、私はすべてのデータをorderArrayに持っている。私は事前にEclipseLinkの1.1

感謝を使用してい

答えて

0

あなたがにJPAに語っていないので、これが起こっている私はそれはあなたが何であったかと思いますが(最初の選択でcurrentEntityをプリフェッチSELECT o, o.currencyEntityを使用してください)。その結果、JPAはループのたびにcurrentEntityをフェッチしなければならず、実際のパフォーマンスを犠牲にしています。

JPAでこれを行う方法は、フェッチ結合documented here)です。あなたはこのようなあなたのクエリを記述します

SELECT o from Order o LEFT JOIN FETCH o.currencyEntity 

これはまた、あなたが唯一のそのcurrencyEntity性質をそのままにして、単一のエンティティを返す必要がありますので、それが簡単に、SELECT o, o.currencyEntityよりも、結果セットをナビゲートすることができます:

List<Order> orders = query.getResultList(); 
for (Order order : orders) { 
    // fully-populated, without requiring another database query 
    Currency ccy = order.getCurrentEntity(); 
} 
+0

ありがとう、私のために働く唯一の問題は、JPA 1.0でネストされたフェッチ結合をサポートしていないことです – sjdms265