web-dev-qa-db-fra.com

hibernate: comment sélectionner toutes les lignes d'un tableau

J'essaie de faire quelque chose comme Select * from LogEntry avec Hibernate. insérer fonctionne bien:

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

[...]
protected EntityManager manager;

protected final String tableName = "LogEntry";

public DatabaseImpl(DB_TYPE db) {
    this.db = db;
    if (entityManagerFactory != null && entityManagerFactory.isOpen()) {
        entityManagerFactory.close();
    }
    entityManagerFactory = Persistence.createEntityManagerFactory(db.getPersUnit());
    manager = entityManagerFactory.createEntityManager();
}
public void insert(LogEntry entry) {

    manager.getTransaction().begin();
    manager.persist(entry);
    manager.getTransaction().commit();
}

Mais lorsque j'essaie d'obtenir les valeurs insérées à l'aide de cette méthode: public LogEntryList getAll () {

    manager.getTransaction().begin();

    Query query = manager.createNativeQuery("SELECT * FROM " + tableName + ";");
    ArrayList<LogEntry> entries = (ArrayList<LogEntry>) query.getResultList();
    manager.getTransaction().commit();

    return new LogEntryList(entries);
}

Je reçois toujours l'exception: Java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to de.motza.entities.LogEntry

Je sais que le problème est lié à la conversion du résultat de la requête sur l'objet, mais je ne trouve nulle part comment convertir correctement les objets ou obtenir plusieurs lignes de la table.

quelqu'un a-t-il des conseils? Si nécessaire, je peux poster mon persistence.xml et plus de code

4
Ruthi Ruth

Puisque vous avez utilisé nativeQuery, vous devez transférer le résultat à l'aide de la méthode setResultTransormer.

    Query query = manager.createNativeQuery("SELECT * FROM " + tableName + ";");
    query.setResultTransformer(Transformers.aliasToBean(LogEntry.class))
    ArrayList<LogEntry> entries = (ArrayList<LogEntry>) query.getResultList();
6
Sunil

Vous pouvez utiliser session.createCriteria(MyEntity.class).list(); par exemple.

ref: Récupérer toutes les lignes d'une table sans HQL?

3
Mahbub

Le "problème" est que vous envoyez une requête native qui renverra un tableau Object [], avec une valeur pour chaque colonne. Vous n'avez pas besoin d'appeler une requête native, mais une requête en veille prolongée, par exemple ...

manager.createQuery("SELECT l FROM LogEntry");

voir, par exemple, cette réponse .

1
Florian Schaetz

Pour commencer, vous devriez essayer de tirer parti de HQL, Hibernate Query Language. Dans l'exemple que vous avez donné ci-dessus, vous essayez d'exécuter une requête SQL native. La raison pour laquelle vous obtenez la ClassCastException est que la requête native contourne la structure et renvoie des Objects brutes au lieu du type souhaité.

Essayez d’utiliser ce code à la place pour votre SELECT *:

String hql = "from LogEntry";
Session session = entityManagerFactory.openSession();
Query query = session.createQuery(hql);
List<LogEntry> logEntries = query.list();      // no ClassCastException here
1
Tim Biegeleisen
List<String> list = null;

TypedQuery<String> query = sessionfactory.openSession().createQuery("from yourTableName");

list = query.getResultList();

yourTableName peut être votre classe @Entity

0
Gol.D

Comme je le sais, getResultList () vous donne une liste ... pas une liste générique. Donc, si vous voulez obtenir une liste générique, vous devez utiliser

TypedQuery<Person> 

au lieu de

Query

C'est le lien que j'ai eu l'information.

Transforme en quelque chose le résultat de Query.getResultList ()?

Je ne connais pas grand chose à propos d'Hibernate. J'espère que cela t'aidera.

0
Tharkana