2011-09-16 16 views
8

To w moim DAO:Wybierz jedną pozycję z bazy danych z wiosny hibernacji SessionFactory

public List<Weather> getCurrentWeather() { 
    return sessionFactory.getCurrentSession().createQuery("from Weather").list(); 
} 

To dostaje wszystkie elementy z tabeli pogoda. Ale powiedzmy, że chcę zrobić coś takiego (Chcę tylko jeden element z tabeli Weather):

public Weather getCurrentWeather() {  
    return sessionFactory.getCurrentSession().createQuery("from Weather where id = 1").list(); // here should be something else than list() 
} 

wiem, nie powinno byćlist()w końcu, ale co muszę napisać tam, aby uzyskać tylko jeden obiekt?

Odpowiedz

11

Jeśli masz identyfikator, po prostu użyć dostać:

public Weather getCurrentWeather() {  
    return sessionFactory.getCurrentSession().get(Weather.class, 1); 
} 

Jeśli trzeba zrobić kwerendę, tak będziesz musiał chwycić górną część zbioru wynikowego, lub można użyć uniqueResult() w zapytaniu.

+1

UniqueResult() jest obiektem, w jaki sposób poradzić sobie z różnicy pogody i normalny obiekt? Czy powinienem maniakalnie rzucić to na Weather? A może jest bardziej odpowiedni sposób? – Jaanus

+2

Tak, rzuciłeś to. Nie ma czegoś takiego jak czas kompilacji bezpieczeństwa z zapytaniami. W jaki sposób kompilator powinien wiedzieć, co ostatecznie wygeneruje instrukcja HQL? – Affe

+0

Ale czy to działa, gdy mam coś innego niż ID, na przykład jakieś pole liczb całkowitych? – Jaanus

7

Czy coś jest nie tak z uzyskaniem listy? :) Nawet jeśli wiesz, że jest tylko jedna hibernacja, nie możesz tego założyć. Jednak uzyskanie listy jest jeszcze bezpieczniejsze!

public Weather getCurrentWeather() {  
    List<Weather> list = sessionFactory.getCurrentSession().createQuery("from Weather where id = 1").list(); // here should be something else than list() 
    return (list.isEmpty() ? null : list.get(0)); 
} 
+0

Tak, myślałem o uzyskaniu listy, ale pomyślałem, czy to także inny sposób. Niemniej jednak, czy powinienem obsłużyć zmianę z listy na pogodę w DAO, tak jak ty, lub po prostu obsłużyć to w moim widoku, uzyskując tam pierwszy element listy? Które byłoby właściwe użycie? – Jaanus

+0

Cóż, naprawdę zależy to od ciebie, ale jeśli nie chcesz, aby listy były cały czas wracane do widoku, zrobiłbym to na poziomie DAO. Ponadto nazwa metody sugeruje, że chcesz tylko bieżącą pogodę, aby inne osoby korzystające później z Twojego kodu mogły nie wiedzieć, dlaczego zwrócona jest lista –

0

Musisz użyć API Kryteria jak poniżej:

List<LeaveManagement> leaveManagements =  session.createCriteria(LeaveManagement.class) 
      .add(Restrictions.isNull("approvedTimeStamp")) 
      .list(); 

    If you want to write a hql query you can write as: 

    String hql = "from LeaveManagement where approvedTimeStamp is null"; 
     Query query = session.createQuery(hql); 
     List results = query.list(); 
Powiązane problemy