Java hibernate:如何选择表中的所有行
我尝试使用Hibernate执行类似于Java hibernate:如何选择表中的所有行,java,mysql,sql,hibernate,postgresql,Java,Mysql,Sql,Hibernate,Postgresql,我尝试使用Hibernate执行类似于Select*fromLogEntry的操作。 插入作品: import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.Persistence; [...] protected EntityManager manager; protected final String tableName =
Select*fromLogEntry
的操作。
插入作品:
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();
}
但当我尝试使用此方法获取插入值时:
公共日志列表getAll(){
manager.getTransaction().begin();
Query Query=manager.createNativeQuery(“从“+tableName+”;”中选择*”;
ArrayList条目=(ArrayList)query.getResultList();
manager.getTransaction().commit();
返回新的日志列表(条目);
}
我总是有例外:
java.lang.ClassCastException:[Ljava.lang.Object;无法强制转换为de.motza.entities.LogEntry
我知道问题在于将查询结果强制转换为对象,但我找不到如何正确地强制转换对象,或者如何从表中获取多行
有人有什么建议吗?
如果需要,我可以发布persistence.xml和更多代码“问题”是,您发送的本机查询将返回一个Object[]数组,每个dolumn有一个值。您不需要调用本机查询,但需要调用hibernate查询,例如
manager.createQuery(“从日志条目中选择l”);
例如,请参见。对于初学者,您应该尝试利用HQL,Hibernate查询语言。在上面给出的示例中,您正在尝试执行本机SQL查询。获得
ClassCastException
的原因是本机查询绕过了框架并返回了原始的对象而不是你想要的那种
尝试将此代码用于您的选择*
:
String hql = "from LogEntry";
Session session = entityManagerFactory.openSession();
Query query = session.createQuery(hql);
List<LogEntry> logEntries = query.list(); // no ClassCastException here
String hql=“from LogEntry”;
会话会话=entityManagerFactory.openSession();
Query=session.createQuery(hql);
List logEntries=query.List();//此处没有ClassCastException
因为您使用了nativeQuery,所以需要使用SetResultTransformer
方法传输结果
Query query = manager.createNativeQuery("SELECT * FROM " + tableName + ";");
query.setResultTransformer(Transformers.aliasToBean(LogEntry.class))
ArrayList<LogEntry> entries = (ArrayList<LogEntry>) query.getResultList();
Query Query=manager.createNativeQuery(“从“+tableName+”;”中选择*”;
query.setResultTransformer(Transformers.aliasToBean(LogEntry.class))
ArrayList条目=(ArrayList)query.getResultList();
据我所知,getResultList()为您提供了一个列表…而不是通用列表。因此,如果您想获得通用列表,必须使用
TypedQuery<Person>
这是我得到信息的链接
我对Hibernate了解不多。我希望这会对您有所帮助。您可以使用
session.createCriteria(MyEntity.class).list();
比如说
ref:列表列表=null;
TypedQuery query=sessionfactory.openSession().createQuery(“从您的表名”);
list=query.getResultList();
yourTableName
可以是您的@Entity
类您使用了哪个版本的hibernate?请尝试以下查询Query=manager.createNativeQuery(“SELECT*FROM”+tableName+“;”,LogEntry.class);List entries=Query.getResultList();hibernate entityManager 4.3.8.最后,请查看下面给出的答案。Transformers.aliasToBean()来自何处?方法createCriteria(类)现在不推荐使用SharedSessionContract类型。虽然这不是用户想要的,但这肯定是有益的信息。这是给我的。感谢您的回答@Tim Biegeleisen:)
TypedQuery<Person>
Query
List<String> list = null;
TypedQuery<String> query = sessionfactory.openSession().createQuery("from yourTableName");
list = query.getResultList();