将此 JPQL 查询转换为 SQL 查询

Posted

技术标签:

【中文标题】将此 JPQL 查询转换为 SQL 查询【英文标题】:Convert this JPQL query to SQL query 【发布时间】:2021-10-09 06:44:09 【问题描述】:
SELECT
        depart_id
    FROM
        department
    GROUP BY
        depart_id
    HAVING
        SUM(emp_id IN ('emp1', 'emp2'))

# depart_id emp_id
1a  emp1
1a  emp2
1a  emp3
1a  emp2
2b  emp1

这里的问题是抛出异常 antlr.MismatchedTokenException: Expecting CLOSE, found 'in'

【问题讨论】:

请通过包含示例 input 表/实体数据,使这个问题成为一个完整的问题。然后向我们展示您想要的确切 输出,并解释您当前的 SQL 查询应该做什么。 表结构是有问题的,不要在意结果,只希望在将提到的查询从 jpql 转换为 sql 时没有编译错误。这部分查询抛出异常SUM(emp_id IN ('emp1', 'emp2')) from jpql to sql ...您的标题说您想从 SQL 转换为 JPQL。这个问题不清楚。 抱歉标题错误,现已更新。 【参考方案1】:

首先,我认为您编写的查询中有错误:

select depart_id from department group by depart_id having sum(emp_id) in ('emp1', 'emp2');

SUM 需要关闭,然后将 IN 应用于此总和的结果。

可以在here 找到有关 CriteriaBuilder 和 JPQL 的一些帮助。

【讨论】:

首先这不起作用,其次通过从 SUM(emp_id IN ('emp1', 'emp2')) 更改为 sum(emp_id) in ('emp1', 'emp2') 将更改整个结果。因为在此 SUM(emp_id IN ('emp1', 'emp2')) 中,我们首先提取位于 ('emp1', 'emp2') 下的 emp_id 然后进行求和,但在您的查询中我们首先进行emp_id 的总和,然后检查 ('emp1', 'emp2') 中的那些,这甚至是不可能的。 Ok ... 然后将 emp_id IN ('emp1', 'emp2') 广告到 WHERE 条件。并且查询将只返回此条件为“真”的行。如果您想为特定部门选择行数,只需选择 COUNT(*)。 我无法更改查询结构,因为这将更改查询结果,并且根据 JPQL 文档,子查询可以在 WHERE 或 HAVING 子句中使用,请检查此链接 docs.oracle.com/html/E13946_04/…。但我不确定聚合超过聚合是否合法。 好的,SUM 是干什么用的?你想选择emp的计数吗?或者它有什么用?可能是当您提供类似预期结果的东西时,有人可以在这里为您提供帮助... 这是一个非常复杂的查询,它首先检查在这种情况下 emp1 和 emp2 有多少 emp id 与给定的 id 匹配,然后对它进行求和,因此使用 count 你会得到 3 和 2 但使用 sum 你会只得到 2 个。

以上是关于将此 JPQL 查询转换为 SQL 查询的主要内容,如果未能解决你的问题,请参考以下文章

将 SQL 查询转换为 JPQL 查询 - 总和具有特定文本值的属性数

条件查询,SQL,JPQL,HQL

在 JPQL 中将整数转换为字符串

将此 SQL 查询转换为 NHibernate 标准查询

将此 SQL 查询转换为 mongodb 查询 -

如何将此 SQL 查询转换为 SQLAlchemy