6

当我在 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 Query Language 查询说 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"

我为这个查询的输出创建了一个模型类,比如 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。我检查了 TypedQuery 但没有得到它的示例。但据我所知,TypedQuery 可以用来映射到 POJO 而不是 Model。我想直接将类型转换为模型。

4

2 回答 2

8

如果您可以使用 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。甲骨文教程相当不错。

您可以像这样在非 EE 应用程序中检索 EntityManager:

  @PersistenceUnit
  private EntityManagerFactory emf;
  ...
  EntityManager em = emf.createEntityManager();
于 2013-03-11T13:17:57.943 回答
3

首先在 POJO 类上创建一个构造函数。

private class POP_Model {
  String person_name;
  String operation_name;
  String project_name;

  public POP_Model(String person_name, String operation_name, String project_name){
      this.person_name = person_name;
      this.operation_name = operation_name;
      this.project_name = project_name;
  }
}

然后你可以使用

select new com.server.dtos.POP_Model(p.name, o.name, project.name) 
from Transaction t INNER JOIN t.operation o
INNER JOIN t.person p 
INNER JOIN t.project project  
where p.id=2

供参考,这里是官方文档也通过HQL遍历New 对象。

于 2013-03-11T13:18:05.337 回答