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

标签 java jpa jpql postgresql-10

“bonjour à tous”(大家好)

我来自这个话题: How can I SELECT rows with MAX(Column value), DISTINCT by another column in SQL?

这个人几乎完成了我在项目中需要做的事情。 事实上,我正在尝试做类似 Git 的事情:检索所有实例的最新版本。 目前,我有一个表“UM”,具有这些属性:

  • int id(主键,自动生成)
  • 字符串名称(可重复)
  • 整数版本(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';

但是当我尝试在 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();

有以下异常(exception):

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.

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

有人能告诉我为什么我的 SQL 请求转换为 JPQL 的请求不起作用吗?

提前致谢:)

最佳答案

要在 JPQL 中使用连接,您的对象图中必须直接依赖于您希望连接的实体。

这个例子来自规范本身:

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

哪里Customer是与 Order 有关系的实体实体通过customer.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) ;

关于java - JPQL 的 INNER JOIN 问题(即使 SQL 请求正在运行),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51042332/

相关文章:

java - Hibernate子类id在每个子类的表中生成

java - RESTEasy POJO json "embedded"对象作为链接/id

java - API 抛出 java.io.UnsupportedEncodingException

java - android.content.res.Resources $ NotFoundException : Resource ID #0x0 drawable

java - Spring CrudRepository,Webservice,返回带有特定字符串的json对象

Java Hibernate JPQL 查询(聚合函数 : count)

java - 状态字段路径无法解析为有效类型。 JPA查询

jpa - jpql - 在一对多集合中选择一些元素

Java InterruptedException 暂停线程?

java - 从Axis1.0版本迁移到Axis2.0版本