在单个查询中使用 JPA 的多个聚合
Multiple aggregations using JPA in a single query
我有一个 table 来存储项目,需要 select 根据多个过滤器聚合数据。
CREATE TABLE Parents(id int, name varchar)
CREATE TABLE Items(id int, parent_id int, field_A int,field_B int)
现在我想计算 field_A=1 的项目,我还想计算 field_A=1 和 field_B=2 的所有 parents 的项目。
SELECT p.id, p.name, count1, count2 FROM Parents p
INNER JOIN
(SELECT count(id) as count1, parent_id FROM Items WHERE field_A=1 GROUP BY
parent_id) select1 ON select1.parent_id=p.id
INNER JOIN
(SELECT count(id) as count2, parent_id FROM Items WHERE field_A=1 AND
field_B=2 GROUP BY parent_id)
select2 ON select2.parent_id=p.id
使用 JPA 作为 JEE 应用程序的一部分来实现它的正确方法是什么?
据我了解,JPA 不支持 sub-queries,我必须使用本机查询。
部分测试数据:
insert into items(id,parent_id, field_A, field_B) values(1,1,1,1);
insert into items(id,parent_id, field_A, field_B) values(2,1,1,2);
insert into items(id,parent_id, field_A, field_B) values(3,1,2,1);
insert into items(id,parent_id, field_A, field_B) values(4,1,2,2);
insert into items(id,parent_id, field_A, field_B) values(5,2,1,2);
insert into items(id,parent_id, field_A, field_B) values(6,2,1,3);
insert into items(id,parent_id, field_A, field_B) values(7,1,1,3);
insert into items(id,parent_id, field_A, field_B) values(8,2,1,2);
insert into items(id,parent_id, field_A, field_B) values(9,2,1,2);
呃,用子查询连接。让我先简化一下你的 SQL:
SELECT
p.id,
p.name,
SUM(1) AS count1,
SUM(CASE i.field_B WHEN 2 THEN 1 ELSE 0 END) AS count2
FROM Items i
JOIN Parents p ON i.parent_id = p.id
WHERE i.field_A = 1
GROUP BY p.id, p.name
您的 JPQL 将变为:
SELECT
p.id,
p.name,
SUM(1),
SUM(CASE WHEN i.fieldB = 2 THEN 1 ELSE 0 END)
FROM Items i
JOIN i.parent p
WHERE i.fieldA = 1
GROUP BY p.id, p.name
In my understanding sub-queries are not supported in JPA
它们是,只是不在 FROM
子句中(不过一些 JPA 提供程序也支持)。
我有一个 table 来存储项目,需要 select 根据多个过滤器聚合数据。
CREATE TABLE Parents(id int, name varchar)
CREATE TABLE Items(id int, parent_id int, field_A int,field_B int)
现在我想计算 field_A=1 的项目,我还想计算 field_A=1 和 field_B=2 的所有 parents 的项目。
SELECT p.id, p.name, count1, count2 FROM Parents p
INNER JOIN
(SELECT count(id) as count1, parent_id FROM Items WHERE field_A=1 GROUP BY
parent_id) select1 ON select1.parent_id=p.id
INNER JOIN
(SELECT count(id) as count2, parent_id FROM Items WHERE field_A=1 AND
field_B=2 GROUP BY parent_id)
select2 ON select2.parent_id=p.id
使用 JPA 作为 JEE 应用程序的一部分来实现它的正确方法是什么? 据我了解,JPA 不支持 sub-queries,我必须使用本机查询。 部分测试数据:
insert into items(id,parent_id, field_A, field_B) values(1,1,1,1);
insert into items(id,parent_id, field_A, field_B) values(2,1,1,2);
insert into items(id,parent_id, field_A, field_B) values(3,1,2,1);
insert into items(id,parent_id, field_A, field_B) values(4,1,2,2);
insert into items(id,parent_id, field_A, field_B) values(5,2,1,2);
insert into items(id,parent_id, field_A, field_B) values(6,2,1,3);
insert into items(id,parent_id, field_A, field_B) values(7,1,1,3);
insert into items(id,parent_id, field_A, field_B) values(8,2,1,2);
insert into items(id,parent_id, field_A, field_B) values(9,2,1,2);
呃,用子查询连接。让我先简化一下你的 SQL:
SELECT
p.id,
p.name,
SUM(1) AS count1,
SUM(CASE i.field_B WHEN 2 THEN 1 ELSE 0 END) AS count2
FROM Items i
JOIN Parents p ON i.parent_id = p.id
WHERE i.field_A = 1
GROUP BY p.id, p.name
您的 JPQL 将变为:
SELECT
p.id,
p.name,
SUM(1),
SUM(CASE WHEN i.fieldB = 2 THEN 1 ELSE 0 END)
FROM Items i
JOIN i.parent p
WHERE i.fieldA = 1
GROUP BY p.id, p.name
In my understanding sub-queries are not supported in JPA
它们是,只是不在 FROM
子句中(不过一些 JPA 提供程序也支持)。