С Hibernate, как я могу запросить таблицу и вернуть хэш-карту с парой ключ-значение id> name? - PullRequest
11 голосов
/ 19 января 2011

У меня есть эта таблица:

table name : Account
Fields : id (varchar), name(varchar), other fields...

Я хочу запросить эту таблицу с помощью механизма гибернации (чтобы использовать второй уровень кэша).Результатом запроса hibernate должна быть хэш-карта, где ключ - это идентификатор поля, а значение - это имя поля.

Как мне написать его с помощью HQL?

Если я используюкарту, я могу использовать только псевдоним, и если я использую конструктор с объектом, я должен преобразовать результат в hashmap, который занимает много времени.

1>Jerome
2>Steve
3>Nick

спасибо

Ответы [ 6 ]

12 голосов
/ 13 мая 2013

Этот вопрос старый, но может помочь другим.Теперь вы можете использовать HQL для возврата карт в спящий режим.Используйте что-то вроде этого:

select new map( max(bodyWeight) as max, min(bodyWeight) as min, count(*) as n ) from Cat cat

Из документов гибернации: http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/queryhql.html#queryhql-select

5 голосов
/ 19 января 2011

Я думаю, что ближе всего вы можете использовать этот запрос:

select id, name from Account

, который даст вам набор результатов из двух массивов длины. Вам нужно будет построить карту вручную, например так:

for(Object[] row : rs) {
    map.put(row[0], row[1]);
}

Обратите внимание, что это в значительной степени игнорирует кэш второго уровня и переводится в запрос SQL.

3 голосов
/ 20 января 2011

Режимом по умолчанию для объекта Hibernate является EntityMode.POJO.

вы можете использовать режим сущностей EntityMode.MAP для получения результатов запроса в формате карты.

0 голосов
/ 11 марта 2011

При использовании имени объекта по умолчанию вы можете применить имя объекта к файлу hbm.xml.

для примера

используя это, hibernate дает пару ключ / значение, что означает возврат карты.

0 голосов
/ 20 января 2011

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("-------");

    }

Редактировать: Вы можете использовать эти объекты результатов как карту, и все готово.

0 голосов
/ 19 января 2011

Если предположить, что на данный момент у Аккаунта нет никаких ленивых ассоциаций, которые могли бы быть загружены, ниже всего, что вы собираетесь получить, с точки зрения производительности:может быть «трудоемким», но Hibernate не может каким-то волшебным образом избежать шага размещения каждой возвращенной строки на карте.

В отличие от другого ответа, это должно выиграть от кэша второго уровня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...