1

Object[]如果我选择特定列,为什么我必须使用打印列表:

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]); 
}

为什么可以使用原始 Test 对象迭代相同的选择(选择 * - 而不是特定的列)?

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对象?

4

2 回答 2

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

这将为 Hibernate 提供一个所谓的行映射器构造函数,从中可以构造Test. 然后你会有一个List<Test>from query.list()。这种方法有一个问题,即您应该在默认构造函数之外为不同的可能查询提供不同的构造函数。

于 2012-04-06T11:22:16.413 回答
1

在您的第一个查询中,您返回一行(如列表),由您选择的“测试”对象的几个属性组成。
它不是“测试”对象,所以你不能这样迭代。

在您的第二个查询中,您返回“测试”对象:“测试”对象列表,因此您可以迭代为“测试”对象。

于 2012-04-06T11:32:52.773 回答