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オブジェクトを使用して同じ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か?

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>からがありquery.list()ます。このアプローチには、考えられるさまざまなクエリに対して、デフォルトのコンストラクターのほかにさまざまなコンストラクターを提供する必要があるという欠点があります。

于 2012-04-06T11:22:16.413 に答える
1

最初のクエリでは、選択した「テスト」オブジェクトのいくつかの属性で構成される行(リストなど)を返します。
これは「テスト」オブジェクトではないため、このような方法で繰り返すことはできません。

2番目のクエリでは、「test」オブジェクト(「Test」オブジェクトのリスト)を返すため、「test」オブジェクトとして反復処理できます。

于 2012-04-06T11:32:52.773 に答える