91 votes

Quelle est la "bonne" façon de convertir Hibernate Query.list() en List<Type> ?

Je suis un débutant avec Hibernate et j'écris une méthode simple pour retourner une liste d'objets. correspondant à un filtre spécifique. List<Foo> semblait un type de retour naturel.

Quoi que je fasse, je n'arrive pas à rendre le compilateur heureux, à moins d'employer un vilain @SuppressWarnings .

import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;

public class Foo {

    public Session acquireSession() {
        // All DB opening, connection etc. removed,
        // since the problem is in compilation, not at runtime.
        return null;
    }

    @SuppressWarnings("unchecked") /* <----- */

    public List<Foo> activeObjects() {
        Session s = acquireSession();
        Query   q = s.createQuery("from foo where active");
        return (List<Foo>) q.list();
    }
}

Je voudrais me débarrasser de ça SuppressWarnings . Mais si je le fais, je reçois l'avertissement

Warning: Unchecked cast from List to List<Foo>

(je peux l'ignorer, mais j'aimerais ne pas l'avoir en premier lieu), et si je supprime le générique pour me conformer à la norme .list() le type de retour, je reçois l'avertissement

Warning: List is a raw type. References to generic type List<E>
should be parameterized.

J'ai remarqué que org.hibernate.mapping fait déclarer un List ; mais c'est un tout autre type - Query renvoie un java.util.List comme un type brut. Je trouve étrange qu'un Hibernate récent (4.0.x) n'implémente pas les types paramétrés, je soupçonne donc que c'est moi qui fais plutôt quelque chose de mal.

Il ressemble beaucoup à Conversion du résultat d'Hibernate en une liste d'objets Mais ici, je n'ai pas d'erreur "dure" (le système connaît le type Foo, et je n'utilise pas une SQLQuery mais une simple Query). Donc pas de joie.

J'ai également examiné Hibernate Class Cast Exception parce qu'il avait l'air prometteur, mais ensuite j'ai réalisé que j'ai no obtenir des Exception ... mon problème est simplement celui d'un avertissement - un style de codage, si vous voulez.

La documentation sur jboss.org, les manuels d'Hibernate et plusieurs tutoriels ne semblent pas couvrir le sujet en tel (ou je n'ai pas cherché dans les bons endroits ?). Lorsqu'ils entrent dans les détails, ils utilisent le moulage à la volée - et ceci sur des tutoriels qui n'étaient pas sur le site officiel jboss.org, donc je suis un peu méfiant.

Le code, une fois compilé, s'exécute sans aucune apparent problème... que je sache... pour le moment ; et les résultats sont ceux attendus.

Alors : est-ce que je fais bien les choses ? Est-ce que je rate quelque chose d'évident ? Existe-t-il une méthode "officielle" ou "recommandé" La manière de le faire ?

0voto

Mahbub Ul Islam Points 93

Tout d'abord, vous devez vous assurer que le nommage dans HQL.

Utilisez le nom de l'entité dans la requête HQL. Si vous ne spécifiez pas de nom dans l'annotation @Entity, la valeur par défaut est le nom de votre classe.

enter image description here

Pour plus d'informations : https://javabydeveloper.com/org-hibernate-hql-internal-ast-querysyntaxexception-entity-table-is-not-mapped/

-1voto

Federico Traiman Points 541

J'ai trouvé la meilleure solution ici la clé de cette question est le addEntity método

public static void testSimpleSQL() {
    final Session session = sessionFactory.openSession();
    SQLQuery q = session.createSQLQuery("select * from ENTITY");
    q.addEntity(Entity.class);
    List<Entity> entities = q.list();
    for (Entity entity : entities) {
        System.out.println(entity);
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X