HQL - 两个相同的查询 - 对象类型的差异

时间:2012-04-06 11:05:52

标签: java hibernate hql iteration

如果我选择特定列,为什么必须使用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个对象?

2 个答案:

答案 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”对象。