java - 如何使用 Hibernate session.createSQLQuery() 来使用 JOIN

标签 java hibernate jpa hibernate-entitymanager

我有两个实体(表)- 员工和项目。一个员工可以有多个项目。 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/

相关文章:

java - hibernate :获取太多行

java - 如何防止 EclipseLink (JPA 2.0) 清除我的数据库/表?

Java Google AutoML NLP 客户端永远等待响应(不抛出异常)

java - 正则表达式匹配 href 链接并将其替换为 <b> </b>

java - 用 "$"替换时 replaceFirst() 失败

java - 在 Java 中以空格分隔的用户数组中输入整数

hibernate - 合并后原始对象将变成什么

java - 没有外键但有反向外键的 hibernate 多对一关系

java - 实体与表的不一致检查

java - 坚持/提交在 Spring JPA JUnit 的测试环境中不起作用