2013-03-11 43 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