2011-01-14 203 views
1

我有兩個實體(表) - 僱員&項目。員工可以有多個項目。 項目表的CREATOR_ID字段指的是員工表的ID字段。員工實體不爲項目維護任何參考 - 但項目實體具有員工參考。如何使用JOIN使用Hibernate的session.createSQLQuery()

使用的EntityManager下面的查詢工作正常 -

entityManager.createQuery(
    "select e from EmployeeDTO e, ProjectDTO p" 
    + " where p.id = ?1 and p.creator.id=e.id"); 

但因爲我有LAZY關聯關係,我得到錯誤:

Could not initialize proxy - no Session

,如果我嘗試從僱員實體項目信息。這是預期的,所以我使用Hibernate的會話來創建查詢,如下所示。

Session session = HibernateUtil.getSessionFactory().openSession(); 
org.hibernate.Query q = session.createSQLQuery(
    "SELECT E FROM EMPLOYEE_TAB E, PROJECT_TAB P WHERE P.ID = " 
    + projectId + " AND P.CREATOR_ID = E.ID") 
    .addEntity("EmployeeDTO ", EmployeeDTO.class) 
    .addEntity("ProjectDTO", ProjectDTO.class); 

但我得到這樣的錯誤:「列‘E’是不是沒有在任何表格從列表或指定一起出現內和 是加入規範的範圍之外......」

任何人都可以提出什麼是這種情況下正確的JOIN語法?如果我使用("SELECT * FROM EMPLOYEE_TAB E, ........") - 它會給出其他錯誤:

java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to com.im.server.dto.EmployeeDTO

在此先感謝。

回答

1

加載EmployeeDTO時,您不需要使用本地SQL查詢來預取ProjectDTO。你原來的查詢可以更優雅的方式改寫爲:

select distinct e from EmployeeDTO e join e.projects p join fetch e.projects where p.id = ?1 

另見:

select e from EmployeeDTO e join e.projects p where p.id = ?1 

然後你就可以以預取項目添加join fetch條款

+0

我收到錯誤:「語法錯誤:遇到」哪裏「在第1行,列52」兩種情況。對於第一種情況,我的查詢是:「SELECT DISTINCT P FROM ProjectDTO P join P.Creator where P.id = 1」。 「創建者」是「ProjectDTO」類的成員:「EmployeeDTO」。 – javauser71 2011-01-16 18:18:09

0

您的SQL以SELECT E from EMPLOYEE E ...開頭,您的意思是SELECT E.*, P.* from EMPLOYEE E ...

+0

否 - 「SELECT E FROM EMPLOYEE ...」應該檢索Employee實體/表的所有屬性。 – javauser71 2011-01-16 19:13:24