Latest Entries »

Sunday, August 9, 2009

Hibernate, pobranie kilku kolumn z tabeli

Dziś opiszę trochę technologię Hibernate czyli frameworka, który zajmuje się mapowaniem obiektów Java na tabele z bazy danych. O ile pobranie zawartości całej tabeli nie jest trudnym zadaniem to wyświetlenie kilku kolumn może przysporzyć programiście trochę pracy. Najpierw szybko przypomnę jak pobrać i wyświetlić całą tabelę, a następnie pokażę jak pobrać poszczególne kolumny.

Zakładam, że klasa HibernateUtil, klasy odwzorowywujące tabele, pliki hbm.xml, są już utworzone w Twoim projekcie.
Dla naszego przykładu zdefiniujmy klasy java np.: Osoba

public class Osoba implements Serializable
{
  private int ID_Osoby;
  private String imie;
  private String nazwisko;
  public Osoba(){}//Domyślny konstruktor JavaBeans.
  // settery i gettery dla każdego 
  pola.:getImie,setImie,getID_Osoba,set_ID_Osoba,setNazwisko,getNazwisko;
}

Zatem po pierwsze tworzymy obiekt sesji i tranzakcji Hibernate:

  Session session = HibernateUtil.getSessionFactory().getCurrentSession();
  Transaction tx = session.beginTransaction();
  tx.begin();
Czas teraz przygotować odpowiednie zapytanie hsql, które pobierze całą tabelę: from Osoba.

  Query Q = session.createQuery("from Osoba");
  ArrayList<Osoba> list= new ArrayList<Osoba>();
  list = (ArrayList<Osoba>) Q.list();
  tx.commit();
Widać, że utworzyłem zmienną list, która jest typu ArrayList z parametrem Osoba. Parametrem jest typ Osoba , ponieważ pobrałem wszystkie kolumny tabeli. Możemy teraz pobrać list.get(int i) poszczególną Osobę i wyświetlić jej informacje na konsoli:
for (int i=0;i<list.size();i++)
{
  Osoba tempOsoba = list.get(i);
  System.out.println(tempOsoba.getID() + " " + tempOsoba.getImie() + " " +   
  tempOsoba.getNazwisko());
}
To był tylko wstęp. Teraz przejdziemy do prawdziwego zadania czyli wyświetlenie 2 kolumn imie oraz nazwisko z tabeli Osoba.

  Session session = HibernateUtil.getSessionFactory().getCurrentSession();
  Transaction tx = session.beginTransaction();
  tx.begin();
  Query Q = session.createQuery("select imie,nazwisko from Osoba");
  //Można zapisać "select osoba.imie,osoba.nazwisko from Osoba as osoba" - bardziej obiektowo :-)
  ArrayList<Object[]>list = new ArrayList<Object[]>;
  for (int i=0;i<list.size();i++)
  {
    Object temp[] = list.get(i);
    System.out.println(temp[0] + " " + temp[1]);
  }

Przydało by się wyjaśnić powyższy fragment kodu. Chodzi o to, że jeśli wybieramy kilka kolumn to implementacja Hibernate najprościej ujmując każdą kolumnę(każdy rekord kolumny jest typu Object) pakuje w obiekt Object. Jeżeli po klauzuli select wystąpią dwie[lub więcej] kolumny np : imie, nazwisko to automatycznie te dwie wartości są udostępniane jako tablica Object[] a dostęp do pól mamy za pomocą indeksów. Dlatego musimy utworzyć odpowiednią listę ArrayList<Object[]> do odebrania danych z rekordów z tabeli.

Można też użyć iteratora dla listy:

for (Iterator i = list.iterator();i.hasNext();){
  Object[] result = (Object[]) i.next();
  System.out.println(result[0] + " " + result[1] );
}

Dziękuję za uwagę - Robert.

0 comments:

Post a Comment