С 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 дает пару ключ/значение, что означает возврат карты.