2016-07-19 45 views
8

Jestem nowy w Hibernate.Wersja Hibernuj 5.2 -> Wiele metod zapytań jest przestarzałych?

Próbuję uzyskać listę imienia i nazwiska wszystkich administratorów.

Istnieją dwa ostrzeżenia w poniższym kodzie. Próbowałem już dużo wyszukiwać w Internecie.

1) Zapytanie jest typu surowego. Odniesienia do typu ogólnego Zapytanie należy sparametryzować.

2) Lista metod() z typu Zapytanie jest przestarzała.

public List<Object> loadAllAdmins() { 
       List<Object> allAdmins = new ArrayList<Object>(); 
       try { 
         HibernateUtil.beginTransaction(); 

         Query q = currentSession.createQuery("SELECT admin.firstName, admin.lastName from AdminBean admin"); 

         allAdmins= q.list(); 

         HibernateUtil.commitTransaction(); 
       } catch (HibernateException ex) { 
         System.out.println("List<AdminBean> loadAllPersons: HibernateException"); 
       } 
       return allAdmins; 
     } 

Ale widzę przykładowy kod tak w całym Internecie. Jak mam rozwiązać te dwa problemy?

Aktualizacja

Ja tylko starałem się stosować kryteria, jak sugeruje. Mówi ona również, że metoda list() jest nieaktualna dla kryteriów ... Wydaje się, że wiele metod jest nieaktualnych zarówno dla zapytania, jak i kryteriów, w tym uniqueResult() i innych ... Jakieś sugestie, w jaki sposób powinienem je zastąpić?

+0

Być może sprawdź daną klasę w JavaDoc, może być sugestia - http://docs.jboss.org/hibernate/orm/5.2/javadocs/org/hibernate/query/QueryProducer.html#createSQLQuery-java.lang .Strunowy- . – Xdg

Odpowiedz

8
public List<Admin> getAdmins() { 
    List<Admin> AdminList = new ArrayList<Admin>(); 
    Session session = factory.openSession(); 
    for (Object oneObject : session.createQuery("FROM Admin").getResultList()) { 
     AdminList.add((Admin)oneObject); 
    } 
    session.close(); 
    return AdminList; 
} 

Ostrzeżenia pochodziły z "Wnioskowania typu".

Miałem podobny problem. Jednak znalazłem rozwiązanie bez "SuppressWarnings".


Niedawno odkryłem krótszy sposób kodowania tych samych rzeczy bez wnioskowania o typ.

public List<Admin> getAdmins() { 
    Session session = factory.openSession(); 
    TypedQuery<Admin> query = session.createQuery("FROM Admin"); 
    List<Admin> result = query.getResultList(); 
    session.close(); 
    return result; 
} 

Mam nadzieję, że to pomaga.

+0

Wydaje się, że jest to ta sama procedura, co podano w mojej odpowiedzi, z wyjątkiem wyraźnej obsady, nieprawdaż? Czy nie jest to lekceważenie podczas rzucania eksplozją każdego obiektu (zobacz http://stackoverflow.com/questions/2170872/does-java-casting-introduce-overhead-why)? –

+0

1. Nie. Jak już stwierdziłem, Ostrzeżenie o usunięciu zostało usunięte. 2. Tak, ale myślę, że byłoby warto. Zazwyczaj warto próbować wypracować sposób uniknięcia ostrzeżenia, zamiast go tłumić. – Pika

0

Czy próbowałeś używać kryteriów?

Patrz, że przykład:

public List<NoteVO> listNotes() { 
    Session session = HibernateSessionFactory.getSession(); 

    Criteria crit = session.createCriteria(NoteVO.class); 

    List<NoteVO> listNotes = crit.list(); 

    session.close(); 
    return listNotes; 
} 
+0

Tak, właśnie próbowałem. Mówi ona również, że metoda list() jest również przestarzała dla kryteriów ... Wydaje się, że "wszystkie metody" są nieaktualne zarówno dla zapytania, jak i kryteriów, w tym uniqueResult() i innych ... Nie wiem, dlaczego to mogło kiedykolwiek zdarzyć. Zrobiłem dokładnie to samo, co wszystkie tutoriale online. –

3

testowanego inne metody hibernate javadoc i wpadł getResultList() metody interfejsu TypedQuery<T>. Przykład:

public List<Admin> getAdmins() { 
    Session session = factory.openSession(); 
    @SuppressWarnings("unchecked") 
    List<Admin> result = session.createQuery("FROM Admin").getResultList(); 
    session.close(); 
    return result; 
} 

Różnica polega na tym, że zwrócony typu createQuery nie Query ale podinterfejsu zwany TypedQuery<T>. Ponieważ jest to wpisany, naprawia również ostrzeżenie "Zapytanie jest surowym typem".

Dzięki takiemu rozwiązaniu można uzyskać Typ bezpieczeństwa ostrzeżenia, które mogą być rozwiązane przez każdą odlewania każdy obiekt wyraźnie lub przez dodanie @SuppressWarnings("unchecked")

Odnośnie charakterystyczne zobaczyć hibernate user guide

Niemniej jednak zastanawiam się, dlaczego samouczki-strona hibernacji nie jest dopasowana.

+0

Ta metoda jest zbyt przestarzała! –