web-dev-qa-db-ger.com

Hibernate 5.2-Version -> Viele Abfragemethoden sind veraltet?

Ich bin neu in Hibernate.

Ich versuche, eine Liste mit Vor- und Nachnamen aller Administratoren zu erhalten.

Der folgende Code enthält zwei Warnungen. Ich habe schon viel versucht online zu suchen.

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

2) Die Methodenliste () 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;
        }

Ich sehe jedoch einen solchen Beispielcode überall im Web. Wie soll ich diese beiden Probleme lösen?

Update

Ich habe nur versucht, Kriterien wie vorgeschlagen zu verwenden. Es heißt auch, dass die list () -Methode für Kriterien veraltet ist. Es scheint, dass viele Methoden sowohl für Query als auch für Kriterien, einschließlich uniqueResult () und andere, veraltet sind.

11
Chenya Zhang
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.


Vor kurzem habe ich einen kürzeren Weg gefunden, um dieselben Dinge ohne Typeninferenz 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.

12
Pika

Importieren Sie nicht QUERY von org.hibernate (as Deprecated now). Importieren Sie stattdessen aus "org.hibernate.query" . Eclipse reference

12
Aniket Warey

Ich habe andere Methoden von hibernate javadoc getestet und kam mit der 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ückgegebene Typ von createQuery nicht Query ist, sondern eine Subschnittstelle namens TypedQuery<T>. Da es typed ist, wird auch die Warnung "Abfrage ist ein Rohtyp" behoben.

Mit dieser Lösung erhalten Sie möglicherweise eine Warnung vom Typ Type Safety, die entweder durch explizite Umwandlung jedes Objekts oder durch Hinzufügen von @SuppressWarnings("unchecked") gelöst werden kann.

Zu den Kriterien siehe Hibernate-Benutzerhandbuch

Trotzdem frage ich mich, warum die Tutorialseite von Hibernate nicht angepasst wird.

3
Johannes H

Haben Sie versucht, Kriterien zu verwenden?

Siehe 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
A. Horst

Obwohl zu spät für die Party, aber es lohnt sich, die überladene createQuery-Methode zu beachten (um Warnungen insgesamt zu vermeiden):

public List<Admin> loadAllAdmins() {
    try {
        HibernateUtil.beginTransaction();
        List<Admin> admins = currentSession.createQuery("SELECT admin.firstName, admin.lastName from AdminBean admin", Admin.class).getResultList();
        HibernateUtil.commitTransaction();
        return admins;
    } catch (HibernateException ex) {
        System.out.println("List<AdminBean> loadAllPersons: HibernateException");
        return new ArrayList<>();
    }
}
0
sharmaap

Gemäß Hibernate Create Query gibt es zwei Arten von createQuery()-Methoden:

Query createQuery(Java.lang.String queryString )

Erstellen Sie eine Abfrageinstanz für die angegebene HQL/JPQL-Abfragezeichenfolge.

<R> Query<R> createQuery(Java.lang.String queryString,
                         Java.lang.Class<R> resultClass)

Erstellen Sie eine typisierte Abfrageinstanz für die angegebene HQL/JPQL-Abfragezeichenfolge.

In Ihrem Fall haben Sie die erste Query-Methode verwendet, und list () ist @deperecated.

Sie können den Benutzer getResultList() anstelle von list() für mehrere Ergebnisse verwenden:

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

       allAdmins= List<Object> currentSession.createQuery("SELECT admin.firstName, admin.lastName from AdminBean admin").getResultList();


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

Für ein einzelnes Ergebnis können Sie getSingleResult() verwenden:

       Admin= (Object) currentSession.createQuery("SELECT admin.firstName, admin.lastName from AdminBean admin").getSingleResult();

PS: Ich habe Object basierend auf Ihrem Typ Object verwendet. Sie können das Ergebnis nach verwendetem Typ umwandeln.

0