当我在createQuery()之后使用Hibernate(HQL)的list()时,我想直接将List<Object[]>
转换为我的List<POJO class>
。我在这里描述我的实际情况。我有3个普通的Java对象,说Person,Operation和Project,一个表说Transaction,带有对Person,Operation和Project的外部引用。
class Person {
String name;
// getters and setters
}
class Operation {
String name;
// getters and setters
}
class Project {
String name;
// getters and setters
}
class Transaction {
String p_id;
String o_id;
String project_id;
// refers to id of All three table above
}
现在,我想执行一个 hibernate 查询语言查询说
String query="select p.name, o.name, project.name from Person p , Operation o, Project project , Transaction t where p.id=2 and p.id=t.p_id and o.id=t.o_id and project.id=t.project_id"
。我已经创建了一个Model类用于此查询的输出,例如POP_Model。
private class POP_Model {
String person_name;
String operation_name;
String project_name;
}
现在,我想使用Hibernate查询:
Session session=HibernateConnection.getSessionFactory().openSession();
Query q=session.createQuery(query);
List<POP_Model> list=(List<POP_Model>)q.list();
它给出了类型转换错误,表明无法将Object []转换为POP_Model。我 checkout 了TypedQuery,但没有得到示例。但是据我所知,TypedQuery可以用于映射到POJO而不是Model。我想直接将强制类型转换为模型。
最佳答案
如果可以使用JPA API(也可以由Hibernate实现)而不是为此使用Hibernate API,则可以使用JPQL构造函数查询:
List<DTO> dtos = entityManager.createQuery("SELECT NEW com.example.DTO( p.name, o.name) FROM Entity o").getResultList();
编辑似乎Hibernate也使用其常规API实现了构造函数表达式:
List<DTO> dtos = session.createQuery("SELECT NEW com.example.DTO( p.name, o.name) FROM Entity o").list();
EDIT2 JPA是Java EE标准,可与Hibernate和EclipseLink等不同的持久性库统一使用。 oracle tutorial非常不错。
您可以像这样在非EE应用程序中检索EntityManager:
@PersistenceUnit
private EntityManagerFactory emf;
...
EntityManager em = emf.createEntityManager();
关于hibernate - Hibernate HQL createQuery()list()类型强制转换为直接建模,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15339504/