私はこのテーブルを持っています:
table name : Account
Fields : id (varchar), name(varchar), other fields...
このテーブルを休止状態のメカニズムでクエリしたい(2番目のキャッシュレベルを使用するため)。 Hibernateクエリの結果は、キーがフィールドIDで、値がフィールド名であるハッシュマップである必要があります。
HQLでどのように書くことができますか?
マップを使用する場合はエイリアスしか使用できず、オブジェクトでコンストラクターを使用する場合は、結果をハッシュマップに変換する必要があり、時間がかかります。
Example :
Id | name | other fields
1 Jerome ...
2 Steve ...
3 Nick ...
クエリの結果はハッシュマップである必要があります:
1>Jerome
2>Steve
3>Nick
ありがとう
この質問は古いですが、これはまだ他の人を助けるかもしれません。 HQLを使用して、休止状態のマップを返すことができるようになりました。次のようなものを使用します。
select new map( max(bodyWeight) as max, min(bodyWeight) as min, count(*) as n ) from Cat cat
Hibernateドキュメントから: http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/queryhql.html#queryhql-select
私はあなたが得ることができる最も近いものはこのクエリを使用することだと思います:
select id, name from Account
これにより、2つの長さの配列の結果セットが得られます。次のように、手動でマップを作成する必要があります。
for(Object[] row : rs) {
map.put(row[0], row[1]);
}
これは主に第2レベルのキャッシュを無視し、SQLクエリに変換されることに注意してください。
HibernateのデフォルトのエンティティモードはEntityMode.POJOです。
entityMode.MAPエンティティモードを使用して、マップ形式でクエリ出力を取得できます。
Hiii.。
以下のコードが役立つかもしれません。
Query query = session.createQuery("select id, name from table");
List results = query.list();
オブジェクトが機能するように結果を表示するには:
int i;
int j;
Object object = null;
for (i = 0; i < results.size(); i++) {
System.out.println("-------");
Object[] obj = (Object[]) results.get(i);
for (j=0;j<obj.length;j++)
{
System.out.println(obj[j]);
}
System.out.println("-------");
}
編集:その結果オブジェクトをマップとして使用でき、完了です。
現時点では、アカウントにロードされる遅延以外の関連付けがないと仮定すると、パフォーマンスの観点から、以下が取得するのに最適です。
List<Account> accounts = (List) session.createQuery("from Account").list();
for (Account account : accounts) map.put(account.getID(), account.getName());
これは「時間がかかる」かもしれませんが、Hibernateが返された各行をマップに配置するステップを魔法のように回避できるわけではありません。
他の回答とは異なり、これは第2レベルのキャッシュの恩恵を受けるはずです。