【问题标题】:JPA Hibernate JOIN ... ON ... ANDJPA Hibernate JOIN ... ON ... 和
【发布时间】:2015-07-31 09:01:26
【问题描述】:

我使用以下查询:

SELECT * FROM phaseinproject as pip JOIN projectinrelease pir 
ON pip.projectInRelease_id = pir.id
JOIN releaseperiod as rp ON pir.release_id = rp.id
JOIN releasestructure as rs ON rs.id = rp.releaseStructure_id
JOIN phaseinreleasestructure as pirs ON pirs.releaseStructure_id = rs.id
JOIN releasephase as rlp ON rlp.id = pirs.phase_id 
AND rlp.id = pip.phase_id 

这个查询完全正常。我得到三个结果(我期望的数量)。

我将此查询转换为以下 HQL 查询:

            TypedQuery<PhaseInProjectOverview> findPhasesInRelease = em.createQuery("SELECT NEW nl.dashboard.dto.out.PhaseInProjectOverview(phaseInProject.id, phase.name, phaseInProject.startDate, phaseInProject.plannedEndDate, phaseInProject.endDate) FROM PhaseInProject phaseInProject "
                + "JOIN phaseInProject.projectInRelease projectInRelease "
                + "JOIN projectInRelease.release release "
                + "JOIN release.releaseStructure releaseStructure "
                + "JOIN releaseStructure.phaseInReleaseStructures phaseInReleaseStructure "
                + "JOIN phaseInReleaseStructure.phase phase "
                + "WHERE release.id = :releaseId ORDER BY phaseInReleaseStructure.position, phaseInProject.startDate", PhaseInProjectOverview.class);
        findPhasesInRelease.setParameter("releaseId", releaseId);
        return findPhasesInRelease.getResultList();

无论我尝试什么:我得到 6 个结果,因为 HQL 似乎不支持"JOIN ... ON ... AND ..." sql 语法。

有人知道如何解决这个问题吗?

编辑: 我用使用过的解决方案添加了我自己的答案。谢谢大家的回答/指点。

【问题讨论】:

  • HQL 是否支持旧的连接语法? (选择...从tab1,tab2 ...其中...)
  • JPQL 在您没有使用的 JOIN 中有一个“ON”关键字。您也没有说明此 JPQL 查询生成的 SQL 是什么。

标签: java sql hibernate jpa hql


【解决方案1】:

试试 with 关键字:phaseInReleaseStructure.phase phase WITH phase.id = phaseInProject.phase_id - 这应该会产生类似releasephase as rlp ON rlp.id = pirs.phase_id AND rlp.id = pip.phase_id 的 SQL

或者,只需在 where 子句中添加该条件:

... WHERE release.id = :releaseId AND phase.id = phaseInProject.phase_id ... 

【讨论】:

  • 似乎 WITH 不能与多个实体一起使用。当我尝试使用它时,我收到以下错误:HQL 错误:with-clause referenced two different from-clause elements
  • @Sverro2 哦,对了,这个限制似乎仍然存在(不幸的是),忘记了。所以你必须使用“where”路由或子选择。有关更多信息,请参阅此处:hibernate.atlassian.net/browse/HHH-7321 - 我希望将来会修复。
【解决方案2】:

我用一个额外的 WHERE 子句解决了我的问题:

phase.id = phaseInProject.phase.id

现在我得到了我期望的结果。 “WITH”关键字似乎不适用于多个实体。当我尝试时,我得到一个异常:

HQL error: with-clause referenced two different from-clause elements

当尝试使用像JOIN phaseInReleaseStructure.phase phase ON phase.id = phaseInProject.id 这样的“ON”语法时,我收到另一个错误:

unexpected token: ON near line 1, column 473

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-19
    • 2012-08-31
    • 2020-03-19
    • 2013-06-21
    • 2014-04-02
    • 2013-06-30
    • 1970-01-01
    • 2020-06-25
    相关资源
    最近更新 更多