Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在单个查询中使用JPA的多个聚合_Jpa_Join_Jakarta Ee_Count_Jpql - Fatal编程技术网

在单个查询中使用JPA的多个聚合

在单个查询中使用JPA的多个聚合,jpa,join,jakarta-ee,count,jpql,Jpa,Join,Jakarta Ee,Count,Jpql,我有一个表来存储项目,需要根据多个过滤器选择聚合数据 CREATE TABLE Parents(id int, name varchar) CREATE TABLE Items(id int, parent_id int, field_A int,field_B int) 现在,我想计算字段_A=1的项目,并且我想计算所有父项的字段_A=1和字段_B=2的项目 SELECT p.id, p.name, count1, count2 FROM Parents p INNER JOIN (SEL

我有一个表来存储项目,需要根据多个过滤器选择聚合数据

CREATE TABLE Parents(id int, name varchar)
CREATE TABLE Items(id int, parent_id int, field_A int,field_B int)
现在,我想计算字段_A=1的项目,并且我想计算所有父项的字段_A=1和字段_B=2的项目

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不支持子查询,我必须使用本机查询。 一些测试数据:

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
据我所知,JPA不支持子查询

不过,有些JPA提供商也支持这一点,只是不在条款中