【问题标题】:Translate SQL query to JPQL将 SQL 查询转换为 JPQL
【发布时间】:2011-09-29 15:01:21
【问题描述】:

以下查询:

SELECT kinder.kindID, kinder.kindName, kinder.kindVorname 
FROM kinder
INNER JOIN (SELECT kindName FROM kinder
    GROUP BY kindName HAVING count(kindID) > 1) dup ON kinder.kindName = dup.kindName
ORDER BY kindName

从我的 MySQL 数据库中查找并显示重复的候选者。
现在我需要帮助将它翻译成 JPQL,到目前为止还没有成功。

【问题讨论】:

  • 你必须使用JPQL吗?即原生 SQL 不是一个选项?
  • 恐怕不是。查询需要从需要在任何 DBMS 上运行的 Java 应用程序中执行。所以,没有原生 SQL。
  • SQL 是相当标准的,至少对于此查询所需的内容而言。我猜这个查询适用于任何 DBMS。
  • 是的,我在您的查询中也没有看到远离标准的 SQL...
  • 我放弃了自己,无法获得正确的 JPQL。我使用了上面的原生查询。但是,如果 JPQL 向导偶然发现了这个问题,请不要犹豫,回答这个问题 :)

标签: mysql jpql


【解决方案1】:

我一直在尝试,想出了与 JB 相同的解决方案。这在 WebSphere 上的 OpenJPA 中运行。

    SELECT k.id, k.name, k.vorname from Kinder k where 
        k.name IN (
        SELECT dup.name FROM Kinder dup 
             GROUP BY dup.name  HAVING count(dup.id) > 1)   

【讨论】:

  • 与 JB 发布的解决方案相同吗?它没有在 Eclipse 上编译,尽管我认为它看起来很正确。最后我坚持使用原生 SQL。它是一个项目中唯一一个包含 50-60 个 JPQL 查询的本地 SQL 查询,但它可以完成这项工作。但是,我很想再试一次。如果可行,我会继续发布该主题。
  • 通常使用COUNT(DISTINCT dup.id)COUNT(dup.id) 等价于 COUNT(*)(除非 dup.id 可以有 NULL)
【解决方案2】:

我不确定 JPQL 中允许子查询的位置,但您的查询:

SELECT kinder.kindID, kinder.kindName, kinder.kindVorname 
FROM kinder
  INNER JOIN
    ( SELECT kindName
      FROM kinder
      GROUP BY kindName
      HAVING count(kindID) > 1
    ) dup
    ON kinder.kindName = dup.kindName
ORDER BY kinder.kindName

也可以使用EXISTS 编写(除了IN 方式):

SELECT k.kindID, k.kindName, k.kindVorname 
FROM kinder k
WHERE EXISTS
      ( SELECT *
        FROM kinder k2
        WHERE k2.kindName = k.kindName
          AND k2.kindID <> k.kindID
      ) 
ORDER BY k.kindName

或使用ANY

SELECT k.kindID, k.kindName, k.kindVorname 
FROM kinder k
WHERE k.kindID <> ANY
      ( SELECT k2.kindID
        FROM kinder k2
        WHERE k2.kindName = k.kindName
      ) 
ORDER BY k.kindName

【讨论】:

  • 我会在星期一早上试试这些。谢谢。
猜你喜欢
  • 2021-10-09
  • 2011-06-12
  • 2019-07-13
  • 1970-01-01
  • 2013-09-17
  • 2017-10-29
  • 2011-03-25
  • 2018-10-29
  • 1970-01-01
相关资源
最近更新 更多