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
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();
Vous pouvez utiliser session.createCriteria(MyEntity.class).list();
par exemple.
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 .
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 Object
s 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
List<String> list = null;
TypedQuery<String> query = sessionfactory.openSession().createQuery("from yourTableName");
list = query.getResultList();
yourTableName
peut être votre classe @Entity
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.