С Hibernate, как я могу запросить таблицу и вернуть hashmap с идентификатором пары значений ключа>name?
у меня есть эта таблица :
table name : Account
Fields : id (varchar), name(varchar), other fields...
Я хочу запросить эту таблицу с помощью механизма гибернации (для использования второго уровня кэша). Результатом запроса hibernate должна быть хэш-карта, где ключом является идентификатор поля, а значением-имя поля.
как я могу написать его с помощью HQL ?
Если я использую map, я могу использовать только псевдоним, и если я использую конструктор с объектом, я должен преобразовать результат в hashmap, который является временем всепоглощающий.
Example :
Id | name | other fields
1 Jerome ...
2 Steve ...
3 Nick ...
результатом запроса должно быть hashmap:
1>Jerome
2>Steve
3>Nick
спасибо
6 ответов
этот вопрос старый, но это все равно может помочь другим людям. Теперь вы можете использовать HQL для возврата карт с помощью hibernate. Использовать что-то вроде этого:
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
который даст вам результирующий набор из двух массивов длины. Вам нужно будет создать карту вручную, например:
for(Object[] row : rs) {
map.put(row[0], row[1]);
}
обратите внимание, что это в значительной степени игнорирует кэш второго уровня и преобразуется в SQL-запрос.
режим сущности по умолчанию Hibernate-EntityMode.POJO-объект.
вы можете использовать EntityMode.Режим сущности карты для получения вывода запроса в формате карты.
предполагая на данный момент, что учетная запись не имеет никаких не ленивых ассоциаций, которые будут загружены, следующее-Это лучшее, что вы получите, с точки зрения производительности:
List<Account> accounts = (List) session.createQuery("from Account").list();
for (Account account : accounts) map.put(account.getID(), account.getName());
Это может быть "много времени", но это не так, как Hibernate может каким-то волшебным образом избежать ввода каждой строки в карту.
в отличие от других ответов, это должно извлечь выгоду из кэша второго уровня.
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("-------");
}
Edit:вы можете использовать эти объекты результатов как карту, и вы сделали.
intead использования имени сущности по умолчанию вы можете применить имя сущности к hbm.XML-файл.
например
используя это, hibernate дает пару ключ / значение, что означает возврат карты.