2012-04-06 87 views
1

爲什麼我必須使用Object[]打印的清單,如果我選擇特定的列:HQL - 兩個相同的查詢 - 在對象類型差異

Session session = DaoSF.getSessionFactory().openSession(); 
List<Object[]> list = new ArrayList<Object[]>(); /* Object[] */ 

Query criteria = session.createQuery(
    "select test.col1, test.col2, test.col3 
    "from Test test " + 
    "group by test.col1, test.col2, test.col3"); 

list = criteria.list(); 

for (Object[] item : list) 
{ 
    System.out.println(item[1] + ", " + item[2] + ", " + item[3]); 
} 

爲什麼它可以重複同樣的選擇(選擇* - - 不是特定的列)使用原始測試對象?

List<Test> list = new ArrayList<Test>(); /* Test */ 
Query criteria = session.createQuery(
    "from Test test " + 
    "group by test.col1, test.col2, test.col3"); 

list = criteria.list(); 

for (Test item : list) 
{ 
    System.out.println(item.getCol1 + ", " + item.getCol2 + ", " + item.getCol3); 
} 

是否有可能 「轉換」 Object[]Test對象?

回答

1

試試這種方法;先在你的Test類中創建一個構造:在查詢

public Test(Col1Type col1, Col2Type2 col2, Col3Type col3) { 
    this.col1 = col1; 
    this.col2 = col2; 
    this.col3 = col3; 
} 

現在,你可以說:

select new Test(t.col1, t.col2, t.col3) 
from Test t 

這會給休眠所謂的行映射器構造外面它可以構造Test的對象。那麼你將有一個List<Test>query.list()。這種方法有一個問題,你應該爲默認提供不同的構造函數,用於不同的可能查詢。

+0

你是冬眠大師!它真的有用,謝謝你:-) – gaffcz 2012-04-06 11:38:49

+1

當然。謝謝,但我不是。 – nobeh 2012-04-06 12:06:33

1

在您的第一個查詢中,您返回一行(如列表),由您選擇的「測試」對象的幾個屬性組成。
它不是「測試」對象,所以你不能迭代這種方式。

在您的第二個查詢中,您返回「測試」對象:「測試」對象列表,因此您可以迭代爲「測試」對象。

+0

謝謝,這很有道理.. – gaffcz 2012-04-07 06:40:26

相關問題