JPQL 的内部连接问题(即使 SQL 请求正常工作)



"bonjour à tous" (大家好(

我来自这个线程: 如何选择具有 MAX(列值(的行,在 SQL 中由另一列不同?

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

  • 整数 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';

但是当我尝试在 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 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 持久性规范的第 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) ;

最新更新