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)
对于初学者,您应该尝试利用 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)
您可以使用
session.createCriteria(MyEntity.class).list();
例如。