2011-11-18 56 views
0

我寫了一個HSQL:可以休眠hsql自動將查詢結果映射到一個類?

String queryString = "select t1.a, t1.b, t2.c from table1 t1, table2 t2 where t1.id = t2.id"; 

,然後我有一個類:

class test{ 
String a; 
String b; 
String c 
....//other getter and setter 
} 

我想: 清單= getHibernateTemplate()找到(的queryString); 這不起作用,當我在jsp頁面中使用測試對象時,它會拋出異常。

我必須手動創建一個測試對象:

List<Object[]> list = getHibernateTemplate().find(queryString); 
test.seta(list.get(0)[0]); 

,纔有可能讓Hibernate自動HSQL映射類給我嗎?

+0

你有table1和table2的hibernate映射嗎? –

回答

1

如果你有兩個Table 1和Table的映射(見PRASHANT問題上面),你可以這樣做:你運行你應該有T1對象的列表查詢後

String queryString = "select t1 from table1 t1 
         inner join t1.table2 t2"; 

for(Table1 t1:listOfTable1Objects) { 
    t1.getA(); //for example or whatever you want to do with your object. 

} 
+0

,但我沒有將table2映射爲與table1的外部關係 – MemoryLeak

+0

然後這不會工作。您必須映射兩個表。 – Mechkov

1

問題是你不寫一個HQL查詢。你只需編寫一個普通的SQL查詢。在HQL中,因爲hibernate使得從表到類的映射,所以不能進行投影。所以,如果你喜歡寫東西

String query = "FROM Class1 WHERE ome_condition;

沒有SELECT子句,休眠就能轉換結果在適當的對象。

你可以看到更多關於此這裏:http://docs.jboss.org/hibernate/core/3.3/reference/en/html/queryhql.html

如果你沒有一個映射,您可以創建這樣的輔助類。說ResultClass。然後添加@NamedNativeQuery和@SqlResultSetMapping註解類:

@NamedNativeQuery(name="queryHehehe", query="select t1.field1 f1, t2.field2 f2 from table1 t1, table2 t2", resultSetMapping="mappingHehehe") 
@SqlResultSetMapping(name="mappingHehehe", entities={ 
    @EntityResult(entityClass=my.clazz.AuxiliaryClass.class, fields = { 
     @FieldResult(name="id", column="f1"), 
     @FieldResult(name="other_property", column="f2") 
    }), 
}) 
public class AuxiliaryClass { 
    public Long id; 
    public String other_property; 
} 

我從來沒有使用過這一點,但可以工作。祝你好運。

+0

謝謝,但沒有一個類包含table1和table2的所有字段 – MemoryLeak

0

如果您需要查詢從多個表返回值,並創建一個映射的類的對象,那麼你需要或者你在這裏做什麼,或使用ResultTransformer

爲了使用HibernateTemplate完成此操作,您需要更改使用模板的方式,可能需要使用execute(HibernateCallback action),因爲您需要將sql查詢轉換爲標準,如Hibernate Reference Native SQL Chapter中所述。

如果您確實想要嘗試此操作,您可能需要使用AliasToBeanResultTransformerAliasToBeanConstructorResultTransformer而不是編寫自己的變壓器。