hibernate:如何选择表中的所有行

Rut*_*uth 4 java mysql sql postgresql hibernate

我尝试Select * from LogEntry用Hibernate 做一些事情.插入工作正常:

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();
}
Run Code Online (Sandbox Code Playgroud)

但是当我尝试使用此方法获取插入的值时: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);
}
Run Code Online (Sandbox Code Playgroud)

我总是得到例外: java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to de.motza.entities.LogEntry

我知道问题是将查询结果强制转换为对象,但我找不到任何地方如何正确地转换对象,或者如何从表中获取多行.

有人有什么建议吗?如果需要,我可以发布我的persistence.xml和更多代码

小智 6

因为您使用了nativeQuery所以需要使用setResultTransormer方法传输结果.

Query query = manager.createNativeQuery("SELECT * FROM " + tableName + ";");
query.setResultTransformer(Transformers.aliasToBean(LogEntry.class))
ArrayList<LogEntry> entries = (ArrayList<LogEntry>) query.getResultList();
Run Code Online (Sandbox Code Playgroud)


Tim*_*sen 5

对于初学者,您应该尝试利用 HQL(Hibernate 查询语言)。在上面给出的示例中,您尝试执行本机 SQL 查询。您得到的原因ClassCastException是本机查询绕过框架并返回原始Object而不是您想要的类型。

尝试使用此代码代替您的SELECT *

String hql = "from LogEntry";
Session session = entityManagerFactory.openSession();
Query query = session.createQuery(hql);
List<LogEntry> logEntries = query.list();      // no ClassCastException here
Run Code Online (Sandbox Code Playgroud)


Mah*_*bub 5

您可以使用 session.createCriteria(MyEntity.class).list(); 例如。

ref:在没有 HQL 的情况下检索表的所有行?

  • SharedSessionContract 类型中的 createCriteria(Class) 方法现已弃用。 (5认同)