2010-05-15 19 views
1

我有一個java對象Person與3個屬性firstname,lastnameusername基本休眠問題使用和SQL查詢

我有一個Oracle存儲過程返回一個結果集與3列。 所有的工作都很好。

現在我有另一個存儲過程,將只返回firstname和lastname而不是用戶名。

我得到以下錯誤:

Could not read column value from result set username

Hibernate試圖獲取從ResultSet中的用戶名屬性。 如果我刪除屬性的用戶名,那麼它的作品。

我的配置:

<sql-query name="normalise" callable="true" > 
<return alias="val" class="com.nbfg.sipc.model.Person"> 
<return-property name="firstname" column="FIRST_NAME"/> 
<return-property name="lastname" column="LASTNAME_NAME"/> 
</return> 
{call SCHSIPC.PKG_SIPC_APP.PRC_SIPC_NORMALISE_RS(?, ?, ?, ?, ?) } 
</sql-query> 

我的POJO的(無註釋)

@Entity 
public class Person { 

    private String firstname; 
    private String lastname; 
    private String username; 
... 

召喚:

private Value call(String app, String cat, String col, String valeure, String query) { 
    try { 
     Query q = getSessionFactory().openStatelessSession().getNamedQuery(query); 
     q.setString(0, app).setString(1, cat).setString(2, col).setString(3, valeure); 
     return (Person) q.list().get(0); 
    } catch (org.hibernate.QueryTimeoutException ex) { 
     throw new IllegalArgumentException(ex.getCause().getMessage()); 
    } 
} 

這一切工作正常,如果我從我的POJO的去除財產username 。我可以重複使用相同的PoJo嗎?

謝謝

回答

2

謝謝你的代碼。我不是100%確定的,但我相信在Hibernate中,SQL查詢必須返回希望查詢實例化的對象的所有字段。

您可能想要嘗試的替代解決方案是依賴HQL並根據需要實例化對象。例如,從Person p中選擇新的Person(firstName,lastName),其中p.username = ... 這實際上允許您在查詢中使用任何類型(具有匹配類型的字段)。

這將解決您的直接問題,但我不確定如何解決在這種情況下使用存儲過程。希望這可以幫助。

+0

如果你正在使用一個簡單的存儲過程,只是做了一個簡單的選擇並返回表格模式(就像使用.NET一樣),我完全可以不用存儲過程。讓hibernate處理關聯,並生成適當的SQL。 – RMorrisey 2010-05-16 19:24:40

0

嗯,如果我們說沒有辦法告訴Hibernate只讀取StoreProcedur返回的ResultSet中的某些列,並且我需要爲每個類型的結果集創建一個單獨的POJO,那麼這個回答。

如果此權利?

+0

據我所知,這是正確的。但是閱讀Hibernate文檔......問題就變成了,你真的需要依賴存儲過程嗎?你絕對不希望每個查詢都有一個POJO,或多或少代表同一個對象。讓你的POJO,讓他們在HQL中定義有用的查詢,並讓例如SLSB爲客戶提供執行這些查詢。清潔和簡單。除非,你必須有存儲的特效。 – mttr 2010-05-18 20:10:29