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

时间:2015-07-23 09:45:57

标签: java mysql sql hibernate postgresql

我尝试用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

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

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

7 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:3)

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

参考:Retrieving all rows of a table without HQL?

答案 2 :(得分:1)

&#34;问题&#34;是,您正在发送一个本机查询,它将返回一个Object []数组,每个dolumn有一个值。您不需要调用本机查询,而是调用hibernate查询,例如......

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

例如,请参阅this answer

答案 3 :(得分:1)

对于初学者,您应该尝试利用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

答案 4 :(得分:1)

如果你使用 Spring HibernateDaoSupport,你可以使用这些方法从数据库加载实体:

a) 单个实体的 ID

@Override
public DeleteProcessNotification getDeleteProcessNotificationById(Long id) {
    return this.getHibernateTemplate().load(DeleteProcessNotification.class, id);
}

b) 所有实体

@Override
public List<DeleteProcessNotification> getDeleteProcessNotificationsInQueue() {
    return this.getHibernateTemplate().loadAll(DeleteProcessNotification.class);
}

c) 带有 HQL 查询的实体

@Override
public List<DeleteProcessNotification> getPrioritizedDeleteProcessNotifications() {
    return (List<DeleteProcessNotification>) this.getHibernateTemplate().find(
            "FROM DeleteProcessNotification dpn \n" +
                    "WHERE dpn.priority = 'HIGH'");
}

HibernateDaoSupport 文档:https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/orm/hibernate5/support/HibernateDaoSupport.html

答案 5 :(得分:0)

据我所知,getResultList()为您提供了List ...而不是通用List。因此,如果您想获得通用列表,则必须使用

TypedQuery<Person> 

insted of

Query

这是我获得信息的链接。

Cast to something the result of Query.getResultList()?

我对Hibernate一无所知。我希望这能帮到您。

答案 6 :(得分:0)

yourTableName

@Entity可以成为您的script :"print('hello\\nworld')",