web-dev-qa-db-ja.com

休止状態:テーブル内のすべての行を選択する方法

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とその他のコードを投稿できます

5
Ruthi Ruth

NativeQueryを使用したため、setResultTransormerメソッドを使用して結果を転送する必要があります。

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

たとえば、session.createCriteria(MyEntity.class).list();を使用できます。

ref: HQLなしでテーブルのすべての行を取得しますか?

3
Mahbub

「問題」は、オブジェクトごとに1つの値を持つObject []配列を返すネイティブクエリを送信していることです。ネイティブクエリを呼び出す必要はありませんが、たとえば休止状態のクエリを呼び出す必要があります...

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

たとえば、 この回答 を参照してください。

1
Florian Schaetz

手始めに、HQL、Hibernateクエリ言語を利用するようにしてください。上記の例では、ネイティブSQLクエリを実行しようとしています。 ClassCastExceptionを取得する理由は、ネイティブクエリがフレームワークを回避し、必要なタイプではなく生のObjectsを返すためです。

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はあなたの@Entityクラス

0
Gol.D

私が知っているように、getResultList()はあなたにリストを与えます...一般的なリストではありません。したがって、一般的なリストを取得したい場合は、使用する必要があります

TypedQuery<Person> 

の本能

Query

これは私が情報を得たリンクです。

Query.getResultList()の結果を何かにキャストしますか?

Hibernateについてはあまり知りません。これがお役に立てば幸いです。

0
Tharkana