2011-01-14 85 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