web-dev-qa-db-fra.com

Hibernate version 5.2 -> Beaucoup de méthodes de requête déconseillent?

Je suis nouveau à Hibernate.

J'essaie d'obtenir une liste des prénoms et noms de tous les administrateurs.

Il y a deux avertissements dans mon code suivant. J'ai déjà essayé de rechercher beaucoup en ligne.

1) La requête est un type brut. Les références au type générique Query doivent être paramétrées.

2) La méthode list () du type Query est obsolète.

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

Mais je vois un exemple de code comme celui-ci sur le Web. Comment dois-je résoudre ces deux problèmes?

Mettre à jour

J'ai juste essayé d'utiliser les critères comme suggéré. Il indique également que la méthode list () est obsolète pour Criteria ... Il semble que de nombreuses méthodes sont obsolètes pour Query et Criteria, y compris uniqueResult () et autres ... Des suggestions sur la façon dont je devrais les remplacer?

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

Les avertissements provenaient de "Type Inference".

J'ai eu le même problème. Cependant, j'ai trouvé une solution sans "SuppressWarnings".


Récemment, j'ai découvert un moyen plus court de coder les mêmes choses sans inférence de type.

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

J'espère que ça aide.

12
Pika

N'importez pas QUERY à partir de org.hibernate (Désactivé maintenant). Importer à la place de "org.hibernate.query" . Référence Eclipse

12
Aniket Warey

J'ai testé d'autres méthodes de hibernate javadoc et je suis arrivé à la méthode getResultList() de l'interface TypedQuery<T>. Exemple:

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

La différence est que le type retourné de createQuery n'est pas Query mais une sous-interface appelée TypedQuery<T>. Comme il s'agit de typed, il corrige également l'avertissement "La requête est un type brut".

Avec cette solution, vous pouvez obtenir un avertissement Type Safety, qui peut être résolu en convertissant chaque objet explicitement ou en ajoutant @SuppressWarnings("unchecked").

En ce qui concerne les critères, voir Guide de l'utilisateur hibernate

Néanmoins, je me demande pourquoi la page de tutoriels d'Hibernate n'est pas ajustée.

3
Johannes H

Avez-vous essayé d'utiliser des critères?

Voir cet exemple:

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

Bien qu’il soit tardif, il peut être utile de noter la méthode surchargée createQuery (pour éviter les avertissements):

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

Selon Hibernate Create Query , il existe deux types de méthodes createQuery():

Query createQuery(Java.lang.String queryString )

Créez une instance de requête pour la chaîne de requête HQL/JPQL donnée.

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

Créez une instance de requête typée pour la chaîne de requête HQL/JPQL donnée.

Dans votre cas, vous avez utilisé la première méthode Query et list () est @deperecated.

Vous pouvez utiliser getResultList() au lieu de list() pour plusieurs résultats:

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

Pour un résultat unique, vous pouvez utiliser getSingleResult():

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

PS: J'ai utilisé Object en fonction de votre type Object, vous pouvez convertir le résultat en fonction du type utilisé.

0
Menai Ala Eddine