2017-07-13 228 views
1

我想用createNativeQuery從我的數據庫中獲取結果集並將其映射到實體對象列表。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(); 

我得到不同的對象的列表像它應該是。但它們沒有映射到我的實體類。

enter image description here

在上面的PIC,你可以看到,當我使用Object和我的實體類類型的代替,我得到的結果集不同的對象返回的每個行。我無法弄清楚爲什麼當我使用我的實體類時,它只是一遍又一遍地重複同一行。

有誰知道什麼可能導致我每次都得到同一個對象的列表?

我的查詢是從流水線功能在存儲過程中選擇

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

UPDATE

我我的過程中調用該管道函數返回大約200行。出於測試目的,我只映射了前幾列。

我的實體類有200列的前13列的映射。 我的查詢調用該函數的做法是select *,所以它返回了所有200列並映射了前13個。我認爲這是一個可能的問題,但我只是用一個新的測試類來做這個測試,並且做了一個select *從常規錶轉換爲只有2個映射列的實體。沒有問題。它返回了不同對象的列表。

我的結論是,必須有一些東西阻止Hibernate遍歷流水線函數的結果集。它返回正確數量的行,但它卡在第一行,並且只是反覆創建該對象。

不似乎有什麼與我的列映射

+0

你能顯示你的查詢嗎? – fg78nc

+0

@ fg78nc我加了一個例子。這是爲了工作,我不能發佈明確的代碼。我正在調用存儲過程中的流水線功能。我的實體類被映射到流水線函數返回的列名。當我不提供我的實體類時,一切正常。但是當我提供它時,它只會重複同一個對象。該對象是流水線函數返回的第一行。 –

+0

SQL字符串中的列別名是否與單個實體的列映射直接匹配? – fg78nc

回答

0

的問題你有沒有嘗試使用這樣的事情?

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註釋,結果並不明顯。當我檢查我的工作時,我只關注被返回列表的大小。

在右列上修復@Id之後,它現在返回不同對象的完整列表。

+0

謝謝 - 只是有同樣的問題... –