我有两个实体(表)- 员工和项目。一个员工可以有多个项目。 Project 表的 CREATOR_ID 字段引用 Employee 表的 ID 字段。员工实体不维护项目的任何引用 - 但项目实体有员工的引用。
使用 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 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; cannot be cast to com.im.server.dto.EmployeeDTO
.
提前致谢。
最佳答案
加载 EmployeeDTO
时,您无需使用 native SQL 查询来预取 ProjectDTO
。您的原始查询可以用更优雅的方式重写,如下所示:
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
另请参阅:
关于java - 如何使用 Hibernate session.createSQLQuery() 来使用 JOIN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4695094/