1

我有两个实体(表) - 员工和项目。一个员工可以有多个项目。项目表的 CREATOR_ID 字段是指 Employee 表的 ID 字段。Employee 实体不维护对 Project 的任何引用 - 但 Project 实体具有对 Employee 的引用。

使用 EntityManager 以下查询工作正常 -

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

但由于我有 LAZY 关联关系,我得到错误:

无法初始化代理 - 没有会话

如果我尝试从 Employee 实体访问项目信息。这是意料之中的,所以我使用 Hibernate 的 Session 来创建查询,如下所示。

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’要么不在 FROM 列表中的任何表中,要么出现在连接规范中,并且超出了连接规范的范围......”

谁能建议这种情况下正确的 JOIN 语法是什么?如果我使用("SELECT * FROM EMPLOYEE_TAB E, ........")- 它会给出其他错误:

java.lang.ClassCastException:[Ljava.lang.Object;不能转换为 com.im.server.dto.EmployeeDTO

.

提前致谢。

4

2 回答 2

1

ProjectDTO加载时不需要使用原生 SQL 查询来预取s EmployeeDTO。您的原始查询可以以更优雅的方式重写,如下所示:

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

然后您可以添加一个join fetch子句以预取项目:

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

也可以看看:

于 2011-01-14T19:48:56.390 回答
0

您的 SQL 以开头SELECT E from EMPLOYEE E ...,您的意思是SELECT E.*, P.* from EMPLOYEE E ...

于 2011-01-14T19:43:13.710 回答