2016-07-19 27 views
8

Ich bin neu bei Hibernate.Hibernate 5.2 Version -> Viele Abfragemethoden verachten?

Ich versuche, eine Liste von Vornamen und Nachnamen aller Administratoren zu erhalten.

Es gibt zwei Warnungen in meinem folgenden Code. Ich habe schon viel online gesucht.

1) Abfrage ist ein Rohtyp. Verweise auf den generischen Typ Query sollten parametrisiert werden.

2) Die Methode list() vom Typ Query ist veraltet.

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; 
     } 

Aber ich sehe Beispielcode so über das ganze Web. Wie soll ich diese beiden Probleme lösen?

aktualisieren

Ich habe gerade versucht, Kriterien zu verwenden, wie vorgeschlagen. Es sagt auch, dass die list() -Methode veraltet ist für Kriterien ... Es scheint, dass viele Methoden für Abfrage und Kriterien, einschließlich uniqueResult() und andere ... veraltet sind. Irgendwelche Vorschläge, wie ich sie ersetzen sollte?

+0

Vielleicht überprüfen gegebene Klasse in JavaDoc, kann es einen Vorschlag geben - http://docs.jboss.org/hibernate/orm/5.2/javadocs/org/hibernate/query/QueryProducer.html#createSQLQuery-java.lang .String-. – Xdg

Antwort

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; 
} 

Die Warnungen stammen von "Type Inference".

Ich hatte das ähnliche Problem. Ich habe jedoch eine Lösung ohne "SuppressWarnings" gefunden.


Kürzlich fand ich einen kürzeren Weg, die gleichen Dinge ohne Typschluss zu codieren.

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

Ich hoffe, es hilft.

+0

Dies scheint das gleiche Verfahren wie in meiner Antwort mit Ausnahme einer expliziten Besetzung, nicht wahr? Ist es nicht ein Nachteil der Laufzeit, jedes Objekt explizit zu deklarieren (siehe http://stackoverflow.com/questions/2170872/does-java-casting-introduce-overhead-why)? –

+0

1. Nein. Wie bereits erwähnt, wird die Unterdrückungswarnung entfernt. 2. Ja, aber ich denke, es wäre es wert. Es ist normalerweise wert, einen Weg zu finden, die Warnung zu vermeiden, anstatt sie zu unterdrücken. – Pika

0

Haben Sie Kriterien verwendet?

Sehen Sie das Beispiel:

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

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

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

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

Ja, ich habe es gerade versucht. Es besagt auch, dass die Methode list() auch für Criteria veraltet ist ... Es scheint, dass "alle Methoden" sowohl für die Abfrage als auch für die Kriterien veraltet sind, einschließlich uniqueResult() und andere. Ich weiß nicht, warum dies überhaupt möglich war geschehen. Ich habe genau das gleiche gemacht wie alle Online-Tutorials. –

3

ich andere Methoden der hibernate javadoc getestet und ich kam mit getResultList() Methode der TypedQuery<T> Schnittstelle auf. Beispiel:

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

Der Unterschied besteht darin, dass der zurück Art von createQuery nicht Query ist aber ein Subschnittstelle genannt TypedQuery<T>. Weil es typisiert ist, behebt es auch die Warnung "Abfrage ist ein roher Typ".

Mit dieser Lösung Sie Typ Sicherheits Warnung erhalten kann, die durch entweder gelöst werden können, die jeweils ausdrücklich oder durch Zugabe Objekt Gießen @SuppressWarnings("unchecked")

In Bezug auf den Kriterien siehe hibernate user guide

Dennoch frage ich mich, warum die Tutorials-Seite von Hibernate wird nicht angepasst.

+0

Diese Methode ist zu veraltet! –