2015-05-21 76 views
2

如果我在DBVisualizer中運行下面的查詢,它將返回一長串值(這是預期的和正確的結果),重複相同的列(從同一個表中一個Oracle 11數據庫)。所以,舉例來說,如果列的3 ID *,** FIRST_NAME它會是這個樣子(我的道歉粗「圖」):SQL查詢僅返回SELECT語句中第一列的值

+-----+------------+-----------+----+------------+-----------+ 
| ID | FIRST_NAME | LAST_NAME | ID | FIRST_NAME | LAST_NAME | 
| 2 | John  | Doe  | 3 | Jane  | Doe  | 

然而,如果我運行一個Java Web應用程序相同的本地查詢(使用Hibernate 3.0,JPA 2.1)映射到上述的Oracle數據庫11的實體類,用下面的代碼片段:

List<ForeignParty> queryResult = null; 
    String sqlQuery = "SELECT f.*, p.POLICY_1_NUM, p.TOTAL_PAYOUT_AMT, f1.*, f2.*, f3.*, f4.* " + 
         "FROM FOREIGN_PARTY f " + 
         "LEFT JOIN POLICY_PAYMENT p ON f.FOREIGN_PARTY_ID = p.FOREIGN_PARTY_ID " + 
         "LEFT JOIN FOREIGN_PARTY f1 ON f.RELATED_PARTY_ID1 = f1.FOREIGN_PARTY_ID " + 
         "LEFT JOIN FOREIGN_PARTY f2 ON f.RELATED_PARTY_ID2 = f2.FOREIGN_PARTY_ID " + 
         "LEFT JOIN FOREIGN_PARTY f3 ON f.RELATED_PARTY_ID3 = f3.FOREIGN_PARTY_ID " + 
         "LEFT JOIN FOREIGN_PARTY f4 ON f.RELATED_PARTY_ID4 = f4.FOREIGN_PARTY_ID " + 
         "WHERE " + 
         "f.PARTY_TYPE_ID = '2' " + 
         "AND f.SOURCE_SYSTEM = :sourceSystem " + 
         "AND f.SOURCE_CLIENT_ID = :sourceClientId"; 
    query = emFatca.createNativeQuery(sqlQuery, ForeignParty.class); 
    query.setParameter("sourceSystem", sourceSystem); 
    query.setParameter("sourceClientId", sourceClientId); 
    try { 
     queryResult = query.getResultList(); 
     //This statement ensures that the PolicyPayment object does not go out of session scope 
     for (ForeignParty fp : queryResult) { 
      fp.getPolicyPaymentCollection().size(); 
     } 
    } catch (NoResultException nre) { 
     nre.getMessage(); 
    } 
    return queryResult; 

...它只按照的規定返回所有列的值。 ,第一項在SELECT以上聲明。我通過臨時移動f4來驗證。中的項SELECT語句是該語句中的第一項,然後看到輸出中的值與那個特定別名的值相匹配。我想知道這是否與這樣的事實,即這是返回多個相同的名稱和相同的實體在一個記錄或行中的列,而不是單獨的記錄?我是否需要使用類似SqlResultSetMapping來爲結果的每次迭代分別設置別名?我認爲這將是很多工作,因爲會有許多列/別名來定義。任何幫助將不勝感激。謝謝!

+0

我可能爲時過早(因爲我仍在添加代碼),但認爲我會分享它。我認爲,原因是Hibernate沒有提出關於結果集不明確的異常,只是添加了第一個SELECT列的值。所以,我從JOIN語句中手動爲每個別名設置單獨的列名和他們自己的別名。因此,例如,而不是使用_f1。* _,我手動將** f1.FOREIGN_PARTY_ID添加爲F1_FOREIGN_PARTY_ID **,依此類推。很多手動編碼,是的,但如果這解決了我的問題,我可以。 – Randy

回答

1

createNativeQuery()需要一個實體類而不是DTO類。如果要將本機查詢映射到非實體結果,則需要使用@SqlResultSetMapping with a @ConstructorResult

+0

嗨弗拉德,謝謝你的回覆!上面的createNativeQuery調用的參數中引用的類** ForeignParty.class **是一個實體類。我猜這個應用程序的獨特之處在於我有一個或多個自動生成的記錄ID插入到數據庫中「主」記錄的特定列中。因此,結果集可能具有映射到實體類(ForeignParty.class)中的相同列的重複實例。這不同於包含一個或多個記錄的「典型」結果集,但每個記錄中只有一組來自實體類的一組列。 – Randy

+0

我將在您的回覆中進一步調查您的鏈接。再次感謝你幫助我。 – Randy

+0

我的歉意,我的意思是儘快這樣做。感謝您的幫助Vlad! :-) – Randy