2017-07-13 17 views
1

createNativeQueryを使用してデータベースから結果セットを取得し、Entityオブジェクトのリストにマップしようとしています。私はJPA createNativeQueryがエンティティクラスにマッピングされていません

List<MyObject> results = this.em.createNativeQuery(query, MyClass.class).getResultList(); 

を行うと

は、私が正しいサイズで、かつ正確に列にマッピングされたエンティティオブジェクトの配列で終わるが、それらはすべて同じオブジェクトです。返される最初の結果は、リスト内のすべてのエントリに対して重複して取得されます。もし上記の写真で

enter image description here

私は戻ってデータを取得することを見ることができる、と私はovbjectsを調べる場合、彼らはきちんと私の列にマップされています。しかし、それらはすべて同じ目的です。

しかし、私は

List<Object[]> objects = this.em.createNativeQuery(query, Object.class).getResultList(); 

をすれば、それがあるべきように私は、個別のオブジェクトのリストを取得します。しかし、彼らは私のエンティティクラスにマップされていません。

上記PICで

enter image description here

、あなたは私がObjectと私のエンティティクラス型の代わりに使用する場合、それぞれの行が返されたため、私は個別のオブジェクトの結果セットを取得することがわかります。 Entityクラスを使用して同じ行を何度も何度も何度も繰り返すのはなぜか分かりません。

私は毎回同じオブジェクトのリストを取得する原因になることは誰にも分かっていますか?私は私のプロシージャ内で呼び出しています

私のクエリがストアドプロシージャにパイプライン化された機能から選択される

String query = "select * from table(myschema.mypackage.myfunction(input_var))"; 

UPDATE

パイプライン化された機能は、約200行を返します。テスト目的のために、私は最初のいくつかの列だけをマップしました。

My Entityクラスには、200個の列のうち最初の13個の列マッピングがあります。 関数を呼び出すクエリでselect *が実行されているため、すべての200個の列が返され、最初の13がマッピングされています。これは問題の可能性があると思っていましたが、私が作成した新しいテストクラスで試したところ、select *通常の表からマッピングされた列のうち2つだけを持つエンティティに変換します。問題はなかった。それは別個のオブジェクトのリストを返しました。

私の結論は、Hibernateがパイプライン化された関数の結果セットを反復することを妨げる何かが存在しなければならないということです。これは正しい数の行を返しますが、最初の行にはまってしまい、そのオブジェクトを繰り返し作成します。

問題は、私の列マッピングが

+0

あなたの質問を表示できますか? – fg78nc

+0

@ fg78nc私は例を追加しました。これは仕事のためのもので、明示的なコードを投稿することはできません。私はストアドプロシージャでパイプライン関数を呼び出しています。私のエンティティクラスは、パイプライン関数によって返された列名にマップされます。 Entityクラスを提供していないときは、すべて正常に動作します。しかし、私がそれを提供するとき、同じオブジェクトを繰り返すだけです。そのオブジェクトは、パイプライン関数から返された最初の行です。 –

+0

SQL文字列の列エイリアスは、単一エンティティの列マッピングと直接一致しますか? – fg78nc

答えて

0

あなたはこのようなものを使用しようとしたのとは何かを持っているように見えるdoesntの?

StoredProcedureQuery q = em.createStoredProcedureQuery("stored_procedure_name"); 
q.registerStoredProcedureParameter("empList", something.class, ParameterMode.REF_CURSOR); 

List<MyObject> myObj= (List<>)q.getOutputParameterValue("paramValue"); 
// ... 
0

明示的な結果セットのマッピング

@SqlResultSetMapping(
    name="myMapping", 
    entities={@EntityResult(entityClass=MyClass.class)} 

そして

em.createNativeQuery(query, "myMapping").getResultList(); 
+0

ポストで私の新しいアップデートをご覧ください。 –

+0

@CodyPritchard https://stackoverflow.com/a/3573413/6161898 – fg78nc

1

を提供しようとすることができますが、それを解決しました。

私はちょうど注意を払っていなかったし、私がしたことを考えていた。

私の@Idアノテーションは、Entityクラスの列に表示されていましたが、明確ではありませんでした。私が仕事をチェックしていたとき、私は返されるリストのサイズに注意を払っていました。

私の@Idを右の列に固定した後、別のオブジェクトの完全なリストを返すようになりました。

+0

よろしくお願いします - 同じ問題がありました... –

関連する問題