2011-02-01 45 views
3

我目前有圍繞一個存儲過程封裝了以下命名查詢: -休眠:在存儲過程映射自定義列名命名查詢

<hibernate-mapping> 
    <sql-query name="mySp"> 
     <return-scalar column="name_first" type="string" /> 
     <return-scalar column="name_last" type="string" /> 

     { call some_sp :param } 
    </sql-query> 
</hibernate-mapping> 

name_firstname_last是由存儲返回的確切的列名程序。我創建了一個包含相同列名的bean,以便我可以將查詢結果映射到該bean中。

public class MyBean { 
    private String name_first; 
    private String name_last; 

    ... 
} 

調用指定的查詢和結果映射到bean的Hibernate代碼: -

MyBean myBean = (MyBean) sessionFactory.getCurrentSession() 
         .getNamedQuery("mySp") 
         .setParameter("param", param) 
         .setResultTransformer(Transformers.aliasToBean(MyBean.class)) 
         .uniqueResult(); 

所有這些做工精細,但而不是依靠列名從存儲過程,我想在MyBean用我自己的列名,例如: -

public class MyBean { 
    private String firstName; // instead of name_first 
    private String lastName; // instead of name_last 

    ... 
} 

如何對存儲過程中的列我的列名在我命名查詢上述地圖?

謝謝。

UPDATE - 我在下面添加了我的最終解決方案。

回答

0

只需手動構建豆:

Object[] columns = (Object[]) sessionFactory.getCurrentSession() 
         .getNamedQuery("mySp") 
         .setParameter("param", param) 
         .uniqueResult(); 
MyBean myBean = new MyBean((String) columns[0], (String) columns[1]); 

這有一個額外的好處:它可以讓你讓你爲my​​Bean不變。

0

您可以使用此blog post中描述的解決方案。 它很好用,可以很好地重用。

1

基於@ partenon對使用自定義ResultTransformer答案,這裏是最終的解決方案: -

MyBean myBean = (MyBean) sessionFactory.getCurrentSession() 
        .getNamedQuery("mySp") 
        .setParameter("param", param) 
        .setResultTransformer(new BasicTransformerAdapter() { 
         private static final long serialVersionUID = 1L; 

         @Override 
         public Object transformTuple(Object[] tuple, String[] aliases) { 
          String firstName = (String) tuple[0]; 
          String lastName = (String) tuple[1]; 

          return new MyBean(firstName, lastName); 
         } 
        }) 
        .uniqueResult(); 
+0

LIMC,你有這樣的例外:在線程異常 「主」 顯示java.lang.NullPointerException \t在org.hibernate.loader.Loader.processResultSet(Loader.java:950) \t在org.hibernate.loader.Loader。 doQuery(Loader.java:921) \t在org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:355) \t在org.hibernate.loader.Loader.doList(Loader.java:2554) \t在有機.hibernate.loader.Loader.doList(Loader.java:2540) \t at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2370)? – May12 2015-10-06 12:31:13