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