JPQL的INNER JOIN问题(即使SQL请求正在运行)

Ant*_*ine 6 java jpa jpql postgresql-10

"bonjouràtous"(大家好)

我来自这个帖子: 如何用SQL中的另一列选择MAX(列值),DISTINCT的行?

这家伙几乎在我的项目中做了我需要的.事实上,我正在尝试做类似Git的事情:检索上一版本中的所有实例.目前,我有一个表"UM",具有以下属性:

  • int id(主键,自动生成)
  • 字符串名称(可以重复)
  • int版本(1,2,3,[...])
  • 字符串fmr
  • [其他属性,在这种情况下不使用]

我在SQL中也有这个请求(运行良好并检索想要的结果):

SELECT * FROM agrid.um AS u INNER JOIN
        (SELECT u2.name, max(u2.version) AS MaxVersion, u2.fmr
         FROM agrid.um AS u2 WHERE u2.fmr = 'CZ2ABVIMG0000' GROUP BY u2.name, u2.fmr) umVersion
         ON u.name = umVersion.name AND u.version = umVersion.MaxVersion
         WHERE u.fmr = 'ABCDE';
Run Code Online (Sandbox Code Playgroud)

但是当我尝试在JPQL中执行相同操作时,我遇到了一些"JOIN"错误:

TypedQuery<UmEty> q = getManager().getEntityManager().createQuery(
            "SELECT u FROM UmEty u INNER JOIN"
            + " (SELECT u2.name, max(u2.version) AS MaxVersion, u2.fmr "
            + " FROM UmEty u2 WHERE u2.fmr = :fmr GROUP BY u2.name, u2.fmr) umVersion"
            + " ON u.name = umVersion.name AND u.version = umVersion.MaxVersion WHERE u.fmr = :fmr", UmEty.class);
    q.setParameter("fmr", fmr);
    return q.getResultList();
Run Code Online (Sandbox Code Playgroud)

有以下例外:

Exception Description: Syntax error parsing
[SELECT u FROM UmEty u INNER JOIN (SELECT u2.name, max(u2.version)
AS MaxVersion, u2.fmr 
FROM UmEty u2 WHERE u2.fmr = :fmr GROUP BY u2.name, u2.fmr) umVersion
ON u.name = umVersion.name
AND u.version = umVersion.MaxVersion WHERE u.fmr = :fmr].
[33, 147] The join association path is not a valid expression.
Run Code Online (Sandbox Code Playgroud)

我也试过简单地使用"JOIN"代替"INNER JOIN",以及其他一些测试(删除"WHERE"子句,......),但我总是抛出这个异常.我对JPQL并不熟悉,我已经阅读了Objectdb上的"INNER JOIN"主题(==> https://www.objectdb.com/java/jpa/query/jpql/from).但即使有这些信息,我也无法获得成功的请求

有人可以告诉我为什么我的SQL请求转换为JPQL一个不起作用?

提前致谢 :)

Joã*_*elo 0

要使联接在 JPQL 中工作,您的对象图中必须对要联接的实体具有直接依赖关系。

这个例子来自规范本身:

SELECT c FROM Customer c JOIN c.orders o WHERE c.status = 1

其中是通过列表对象Customer与实体有关系的实体。Ordercustomer.orders

您可以在Java Persistence Spec第 4.4.5 章中阅读有关联接的更多信息

编辑:

您可能希望重写查询以符合以下格式:

select * from agrid.um u where u.fmr = 'ABCDE' and not exists (select * from agrid.um u2 where u.name = u2.name and u.version < u2.version) ;