将此 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 查询的主要内容,如果未能解决你的问题,请参考以下文章