2011-12-21 11 views
1

createNativeQueryを使用してランダム選択句の値をドメインオブジェクトに変換する方法はJPAにありますか。ドメインオブジェクトはjpaネイティブSQLからエンティティへのスカラー値の変換

を管理していない私は、次のSQLクエリ

select name, count(*) as cnt, sum(average_events)/count(*) as avg_events from (complex subquery) 

私は3つのインスタンス変数a、bおよびcを持つドメインオブジェクトに値をA、B、Cを変換したいを持っています。このドメインオブジェクトはJPAによって管理されていないため、@Entityおよび対応するテーブルはありません。

現在、私はオブジェクトのリストを返す以下を実行しています。

Query query = objectManager.getEntityManager().createNativeQuery(sqlStr); 
List resultList = query.getResultList(); 

答えて

5

使用この構文:MyCustomObjectがある

SELECT new foo.MyCustomObject(a, b, c) FROM ... 

が一致consdtructor持つ任意のクラス:

public class MyCustomObject { 
    private final String name; 
    private final int cnt; 
    private final float avg; 
    public MyCustomObject(String name, int cnt, float avg) { 
    this.name = name; 
    this.cnt = cnt; 
    this.avg = avg; 
    } 
    //...getters 
} 

Scalaはボーナス:同等クラス:

class MyCustomObject(name: String, cnt: Int, avg: Float) 
//no, actually that's it 
+0

もし私がそれを持っていればわかりません....質問で更新しました – user373201

+0

@ user373201:試しましたか? 'SELECT new'構文はオブジェクトを作成し、指定されたコンストラクタを呼び出します。つまり、 'query.getResultList()'は 'List 'ではなく 'List 'を返します。また、 'MyCustomObject'は、一致するコンストラクタを持つ*任意の*オブジェクトにすることができます。 MyCustomObjectのフィールド名を更新して、クエリに使用された名前に合ったものにしました。 –

2

だけで合格「resultCl ass "をcreateNativeQuery呼び出しに追加します。確かにDataNucleus JPAで動作します。

+0

trueまた、Hibernateでも動作し、コンストラクタに必要な追加の定型コードを含むSELECT NEW()は必要ありません。 http://www.oracle.com/technetwork/articles/の「ネイティブSQLクエリ」を参照してください。 vasiliev-jpql-087123.html – Gregor

関連する問題