如果我选择特定列,为什么必须使用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对象迭代相同的select(select * - 而不是特定的列)?
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
个对象?
答案 0 :(得分: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>
获得query.list()
。这种方法有一个问题,你应该在默认旁边为不同的可能查询提供不同的构造函数。
答案 1 :(得分:1)
在第一个查询中,您返回一行(如列表),其中包含您选择的“测试”对象的多个属性。
它不是“测试”对象,所以你不能以这种方式迭代。
在第二个查询中,返回“test”对象:“Test”对象列表,因此可以迭代为“test”对象。