hibernate HQL createQuery()list()类型直接转换为模型

Mis*_*sha 6 model-view-controller hibernate struts2

当我在createQuery()之后使用Hibernate(HQL)的list()时,我想直接输入cast List<Object[]>给我List<POJO class>.我在这里描述我的实际情况.我有3个普通的旧Java对象说人,操作和项目和一个表说事务外部引用人,操作和项目.

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
}
Run Code Online (Sandbox Code Playgroud)

现在,我想执行一个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;
}
Run Code Online (Sandbox Code Playgroud)

现在,我想使用Hibernate查询:

Session session=HibernateConnection.getSessionFactory().openSession();
Query q=session.createQuery(query);
List<POP_Model> list=(List<POP_Model>)q.list();
Run Code Online (Sandbox Code Playgroud)

它给出了类型转换错误,指出Object []无法转换为POP_Model.我检查了TypedQuery但没有得到它的例子.但据我所知,TypedQuery可用于映射到POJO而不是Model.我想直接键入强制转换为模型.

kos*_*tja 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();
Run Code Online (Sandbox Code Playgroud)

编辑看起来Hibernate也使用它的常规API实现构造函数表达式:

List<DTO> dtos = session.createQuery("SELECT NEW com.example.DTO( p.name, o.name) FROM Entity o").list();
Run Code Online (Sandbox Code Playgroud)

EDIT2 JPA是一个Java EE标准,统一使用不同的持久性库,如Hibernate和EclipseLink.在甲骨文教程是相当不错的.

您可以在非EE应用程序中检索EntityManager,如下所示:

  @PersistenceUnit
  private EntityManagerFactory emf;
  ...
  EntityManager em = emf.createEntityManager();
Run Code Online (Sandbox Code Playgroud)