Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java tools & IDE's > Hibernate загружает результаты в Map?


Автор: Shaggie 21.6.2007, 10:14
Есть таблица person. SELECT * FROM person выводит:

 id | name 
----+------
  1 | Jerry 
----+------
  7 | Mike

В программе использую hibernate и результаты получаю так:
Код

List collection = session.createQuery("FROM Person").list();

// выводим строки на экран
for (int i = 0; i < collection.size(); i++) {
    Person p = (Person) collection.get(i);
    System.out.println("Person: " + p.getId() + " name: " + p.getName());
}
// вывод
// "Person: 1 name: Jerry"
// "Person: 7 name: Mike"


В итоге имеем List объектов Person. Мне же в целевом проекте удобнее было бы использовать Map, точнее, TreeMap, где key мапа был бы равен значению поля id таблицы (которое является одновременно уникальным primary key), а value был бы сам объект Person.

То есть в случае необходимости можно было бы без перебора всего List в поисках нужного id получать его сразу, просто обратившись к мапу и передав его итератору номер объекта. Пример:
Код

TreeMap collection; // в нём уже загружены все объекты

public void showPerson(int number) {
    Person p = (Person) collection.get( new Integer(number) );
    System.out.println("Person: " + p.getId() + " name: " + p.getName());
}

public static void main(String[] args) {
    showPerson(7);
// выводит "Person: 7 name: Mike"
}

Конечно, можно получать List объектов и в цикле перегонять его в Мап. Однако есть мнение, что это не будет эффективно... Есть возможность создавать такой мап программно средствами hibernate в процессе загрузки результатов? Чтобы session.createQuery("FROM Person") возвращал готовый мап?

Автор: Shaggie 28.6.2007, 12:25
Нашёл что-то более или менее эффективное в http://www.hibernate.org/hib_docs/reference/en/html/objectstate.html#objectstate-querying-executing-iterate. Запросом следует вернуть не список, а итератор:
Код

TreeMap collection;

Iterator iter = session.createQuery("FROM Person").iterate();

// выводим строки на экран
while(iter.hasNext()) {
    Person p = (Person) iter.next();
    collection.put( new Integer( p.getId() ) , p)
}

Спасибо, что прочитали тему.

Автор: batigoal 28.6.2007, 15:07
Shaggie, спасибо за инфу.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)