С Hibernate, как я могу запросить таблицу и вернуть хэш-карту с ключом пары id> name?
У меня есть эта таблица:
table name : Account
Fields : id (varchar), name(varchar), other fields...
Я хочу запросить эту таблицу с помощью механизма hibernate (чтобы использовать второй уровень кеша). Результатом запроса спящего режима должно быть хэш-карта, где ключ является идентификатором поля и где это значение является именем поля.
Как я могу написать его с помощью HQL?
Если я использую карту, я могу использовать только псевдоним, и если я использую конструктор с объектом, я должен преобразовать результат в hashmap, который занимает много времени.
Example :
Id | name | other fields
1 Jerome ...
2 Steve ...
3 Nick ...
результат запроса должен быть hashmap:
1>Jerome
2>Steve
3>Nick
спасибо
Ответы
Ответ 1
Этот вопрос старый, но это может помочь другим людям.
Теперь вы можете использовать HQL для возврата карт с гибернацией.
Используйте что-то вроде этого:
select new map( max(bodyWeight) as max, min(bodyWeight) as min, count(*) as n ) from Cat cat
Из hibernate docs:
http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/queryhql.html#queryhql-select
Ответ 2
Я думаю, что ближе всего вы можете использовать этот запрос:
select id, name from Account
который даст вам набор результатов из двух массивов длины. Вам нужно будет создать карту вручную, например:
for(Object[] row : rs) {
map.put(row[0], row[1]);
}
Обратите внимание, что это в значительной степени игнорирует кеш второго уровня и переводится в SQL-запрос.
Ответ 3
Режим сущности по умолчанию для Hibernate - EntityMode.POJO.
вы можете использовать EntityMode.MAP сущ. режим для получения вывода запроса в формате карты.
Ответ 4
Предполагая, что на тот момент, когда у Учетной записи не было никаких ленивых ассоциаций, которые будут загружены, следующее будет лучшим, что вы собираетесь получить, с точки зрения производительности:
List<Account> accounts = (List) session.createQuery("from Account").list();
for (Account account : accounts) map.put(account.getID(), account.getName());
Это может быть "трудоемким", но это не так, как Hibernate может как-то волшебным образом избежать шага поместить каждую возвращенную строку в карту.
В отличие от другого ответа, это должно извлечь выгоду из кэша второго уровня.
Ответ 5
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("-------");
}
Изменить: вы можете использовать объекты результатов в качестве карты, и вы сделали.
Ответ 6
Вместо использования имени сущности по умолчанию вы можете применить имя сущности к файлу hbm.xml.
для примера
используя это, hibernate дает пару ключ/значение, что означает возврат карты.