2013-03-19 166 views
4

有沒有辦法在未映射表上使用java bean功能?Hibernate查詢未映射表

所以,我有一個只用於讀取的表,它將永遠不會被修改。我需要查詢它只顯示數據。但我不希望在查詢未映射對象時,hibernate默認使用的Object []返回類型。我想將結果檢索到自定義類型集合中。但我將不得不創建hbm文件來執行此操作。無論如何只要創建自定義類型並且沒有hbm文件?

loadResults() 
{ 
    String qry = "select col1, col2 from table";     
    List<CustomType> result = (ArrayList<CustomType>) dao.HQLWithTransformer(qry, new CustomTransformer()); 
} 

定製變壓器:

public class CustomTransformer implements ResultTransformer { 



@Override 
public Object transformTuple(Object[] rowdata, String[] arg1) 
{  

     return new CustomType(String.valueOf(rowdata[0]),String.valueOf(rowdata[1])); 

    return null; 
} 

@Override 
public List transformList(List arg0) { 
    return null; 
} 

}

DAO方法:

加載結果

Businessobj方法

public Collection HQLWithTransformer(String qry, ResultTransformer rt){  

    List<?> al=null; 
     try 
     {    
     Query q = sess.createQuery(qry); 
     q.setResultTransformer(rt); 
     al = (ArrayList<?>)q.list();     
     } 
     catch(HibernateException he) 
     {  
     log.debug("Hibernate Exception", he); 
     } 
     finally 
     { 
     sess.close();   
     } 

    return al; 
    } 

回答

2

你也可以使用構造函數的表達式,像這樣:

List<MyClass> dtos = session.createQuery("SELECT NEW com.example.MyClass(e.name, e.data) FROM Entity e").list(); 

的缺點是,你也必須創建Entity,以查詢其映射表。您可以使用註釋執行此操作,因此您不必創建hbm文件。

從技術上講,它不是你所要求的。儘管我發現它對映射類似報表的查詢很有用,所以也許它就是您要查找的內容。

+0

嘗試了註釋。由於某些原因,註釋未被識別。我的classpath有hibernate-jpa-2.0-api-1.0.0.Final.jar,hibernate3.jar(3.5),hibernate-validator-4.0.2.GA.jar。 – sotn 2013-03-19 20:23:22

+0

我能弄清楚爲什麼註釋不起作用。有一些設置問題。 – sotn 2013-03-21 05:51:57

+0

@sotn酷,很高興你明白了:) – kostja 2013-03-21 08:27:35

0

您可以設置一個ResultTransformer您查詢。

Hibernate提供了各種轉換器,可以將查詢結果轉換爲未映射類型。例如,AliasToBeanResultTransformer根據所選字段的別名執行轉換。

+0

創建了一個自定義變壓器。我的代碼在OP中。我仍然看到表未映射錯誤。 – sotn 2013-03-19 20:30:09

+0

非映射表只能用SQL查詢查詢,而不能查詢HQL查詢。使用'createSQLQuery()'。 – axtavt 2013-03-19 22:10:40

1

您可以使用NativeCriteria庫(Project on github, available on maven central)。示例代碼如下所示:

NativeCriteria c = new NativeCriteria(new HibernateQueryProvider(hibernateSession), "table_name", "alias"); 
c.setProjection(NativeExps.projection().addProjection("alias.column_name")); 
c.add(NativeExps.isNull("alias.column_name")); 
c.setOrder(NativeExps.order().add("alias.column_name", OrderType.ASC)); 
CriteriaResult res = c.criteriaResult(); 
while (res.next()) 
{ 
    resp.add(res.getLong(0, null)); 
} 

Offical page庫。這個基於hibernate session和createSQLQuery的庫提供了非常乾淨和簡單的API來生成動態和複雜的查詢,這些查詢不具有與映射類相同的效果。

您可以在測試模塊上看到更多示例(以及與Spring/Spring Boot的集成)。