2013-03-11 46 views
5

当我在createQuery()之后使用Hibernate(HQL)的list()时,我想直接输入List<Object[]>到我的List<POJO class>。我在这里描述我的实际情况。我有3个普通的旧Java对象说人,操作和项目和一个表说交易与外部引用个人,操作和项目。hibernate HQL createQuery()list()类型直接转换为模型

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"

我已经创建了一个模型类来输出这个查询,说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(); 

它给类型转换错误,说对象[]不能被转换为POP_Model。我检查了TypedQuery,但没有得到它的例子。但据我所知,TypedQuery可以用来映射到POJO而不是Model。我想直接输入到模型。

+0

更好地解决问题的方法之一是切换到标准API。 – 2013-03-11 13:16:12

+0

“Criteria Api”是指?你可以参考它的任何链接。 – Misha 2013-03-11 13:19:51

回答

6

如果你是使用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标准,统一用不同的持久librarie工作像Hibernate和EclipseLink。 oracle tutorial是相当体面的。

你可以在这样的非EE应用程序获取一个EntityManager:

@PersistenceUnit 
    private EntityManagerFactory emf; 
    ... 
    EntityManager em = emf.createEntityManager(); 
+0

我第一次遇到JPA API。你能建议我JPA示例的好链接吗?我正在使用Struts 2应用程序。其次,我怎样才能获得entityManager对象? – Misha 2013-03-11 13:29:38

+0

@Misha - 增加了一些detials,希望它可以帮助你进一步。国际海事组织你不应该陷入学习一个新的API,休眠本身提供这个功能,所以我会暂时与休眠版本,留在后面记住JPA。 – kostja 2013-03-11 13:57:38

+0

@@ kostja:非常感谢。我使用了session.createQuery(),它工作成功.. – Misha 2013-03-12 10:14:54

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 

仅供参考,这里是official documentation。 也要通过New object with HQL