HibernateでSelect * from LogEntry
のようなことをしようとしています。挿入はうまくいきます:
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();
}
しかし、このメソッドを使用して挿入された値を取得しようとすると、次のようになります。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);
}
私はいつも例外を受け取ります:Java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to de.motza.entities.LogEntry
問題はQuery結果をオブジェクトにキャストすることですが、オブジェクトを適切にキャストする方法や、テーブルから複数の行を取得する方法はどこにもありません。
誰かアドバイスはありますか?リクエストがあれば、persistence.xmlとその他のコードを投稿できます
NativeQueryを使用したため、setResultTransormer
メソッドを使用して結果を転送する必要があります。
Query query = manager.createNativeQuery("SELECT * FROM " + tableName + ";");
query.setResultTransformer(Transformers.aliasToBean(LogEntry.class))
ArrayList<LogEntry> entries = (ArrayList<LogEntry>) query.getResultList();
たとえば、session.createCriteria(MyEntity.class).list();
を使用できます。
「問題」は、オブジェクトごとに1つの値を持つObject []配列を返すネイティブクエリを送信していることです。ネイティブクエリを呼び出す必要はありませんが、たとえば休止状態のクエリを呼び出す必要があります...
manager.createQuery("SELECT l FROM LogEntry");
たとえば、 この回答 を参照してください。
手始めに、HQL、Hibernateクエリ言語を利用するようにしてください。上記の例では、ネイティブSQLクエリを実行しようとしています。 ClassCastException
を取得する理由は、ネイティブクエリがフレームワークを回避し、必要なタイプではなく生のObject
sを返すためです。
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
はあなたの@Entity
クラス
私が知っているように、getResultList()はあなたにリストを与えます...一般的なリストではありません。したがって、一般的なリストを取得したい場合は、使用する必要があります
TypedQuery<Person>
の本能
Query
これは私が情報を得たリンクです。
Query.getResultList()の結果を何かにキャストしますか?
Hibernateについてはあまり知りません。これがお役に立てば幸いです。