SQL 到 JPQL 加入请求

Posted

技术标签:

【中文标题】SQL 到 JPQL 加入请求【英文标题】:SQL to JPQL join request 【发布时间】:2019-03-30 01:40:32 【问题描述】:

希望这里有人可以帮助我。

我找到了我想在 sqlDev 上使用的请求:

SELECT t1.*
  FROM table1 t1 INNER JOIN
(
  SELECT ev.ID_AGENCE, MAX(ev.DATE_CREATION) DATE_CREATION
    FROM table1 ev
    WHERE ev.ID_AGENCE IN (326,324)
    GROUP BY ev.ID_AGENCE
) t2 ON t1.ID_AGENCE = t2.ID_AGENCE
    AND t1.DATE_CREATION = t2.DATE_CREATION
    order by t1.id_agence;

只保留列表中最接近的日期,并且每个 id 只保留一个(在我的示例中为 324 和 326):

324 22/10/18
324 21/10/18
324 20/10/18
326 10/08/18
326 09/08/18
326 07/08/18
326 06/08/18
326 05/08/18
326 04/08/18
326 03/08/18
326 02/08/18
326 01/08/18

我尝试翻译成 JPA (JPQL):

final String requete = "SELECT e FROM ClasseJava JOIN " + 
                "( " + 
                    "SELECT f.id, MAX(f.dateCreation) dateCreation " + 
                    "FROM ClasseJava f " + 
                    "WHERE f.idAgence IN (326,324) " + 
                    "GROUP BY f.idAgence " + 
                ") "                        + 
                "t ON e.idAgence = t.idAgence " + 
                "AND e.dateCreation = t.dateCreation " + 
                "GROUP BY idAgence ";

final TypedQuery<ClasseJava> query = entityManager.createQuery(requete, ClasseJava.class);
query.setParameter("listIdAgence", listIdAgence);
return query.getResultList();

我收到以下错误:“加入关联路径不是有效的表达式。”

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

【问题讨论】:

我认为您需要提供ClasseJava 并描述您实际想要做的事情,而不是仅仅粘贴一些查询 JPQL JOINS with nested SELECT的可能重复 【参考方案1】:

根据this answer,不可能在连接子句中使用子查询。 Criteria API 和 HQL 也可以这样说

也许您可以使用 HAVING 子句或将子查询移动到 WHERE 子句来重写您的查询?

【讨论】:

我让它像这样工作:final String requete = "SELECT e FROM classeJava e, " + "( " + "SELECT f.idAgence, MAX(f.dateCreation) dateCreation " + "FROM classeJava f " + "哪里 f.idAgence IN :listIdAgence " + "GROUP BY f.idAgence " + ") " + "t WHERE e.idAgence = t.idAgence " + "AND e.dateCreation = t.dateCreation " + "ORDER由 e.idAgence ";【参考方案2】:

我通过删除 Join 子句使其工作。

像这样:

 final String requete = "SELECT e FROM classeJava e, " + 
"( " + 
"SELECT f.idAgence, MAX(f.dateCreation) dateCreation " + 
"FROM classeJava f " + 
"WHERE f.idAgence IN :listIdAgence " + 
"GROUP BY f.idAgence " + 
") " + 
"t WHERE e.idAgence = t.idAgence " + 
"AND e.dateCreation = t.dateCreation " + 
"ORDER BY e.idAgence ";

希望这对某人有所帮助。

【讨论】:

您在使用 EclipseLink 吗?只有 EclipseLink 2.4 或更高版本可以支持使用 JPQL 对 FROM 子句进行子查询。

以上是关于SQL 到 JPQL 加入请求的主要内容,如果未能解决你的问题,请参考以下文章

使用子句 IN 从 sql 转换为 jpql

带有加入条件的 SQL 请求

使用 JPQL 加入标准

SQL一请求加入表group_concat

JPQL 到 SQL 使用 Hibernate 更新查询交叉连接问题

SQL到JPQL - 哈希因公式