spring-data-jpa JPA/SQL -使用组合主键筛选表,并在一个查询中对其执行连接

iq0todco  于 2022-11-10  发布在  Spring
关注(0)|答案(1)|浏览(213)

我有2个表,我需要使用这些表来根据一些条件获取相关条目。
表A(id 是主键)如下所示

id  | name  | age  | status
id1 | name1 | age1 |   n
id2 | name2 | age2 |   n
id3 | name3 | age3 |   n
id4 | name4 | age4 |   n

表B(id & country 是组合主键,id 是两个表中的公共列)如下所示

id  | country
id1 | country1
id1 | country2
id2 | country1
id3 | country2
id4 | country1

现在,我想在这两个表上使用一个连接,以从表A中获取条目,条件是表B中的条目包含country 1,但不包含country 2。换句话说,根据两个表中的数据,所需的输出将是

id  | name  | age  | status
id2 | name2 | age2 |   n
id4 | name4 | age4 |   n

因此,此处id 1不是输出的一部分,因为表B中的条目中包含id 1的country 1和country 2。
我正在使用spring data JPA和@Query来执行我的查询(在postgres数据库上)。
我最初的想法是像这样链接多个AND语句

select entryA
from tableA entryA
  left join tableB entryB on entryA.id = entryB.id
where entryB.country <> 'country1'
  and entryB.country = 'country2'

然而,这并不起作用(我仍然将id 1条目视为我的最终输出)。
我还尝试使用CASE IF END,如下所示

select entryA
from tableA entryA
  left join tableB entryB on entryA.id = entryB.id
where case if entryB.country <> 'country1' then true
           else false
      end
  and entryB.country = 'country2'

但这不起作用,因为CASE END不应该出现在WHERE之后(从我得到的异常判断)。我试图移动它,在我的查询中放置在不同的地方,但我从来没有设法使它工作。
我还尝试在CASE END参数内的查询中使用COUNT,但仍然无法确定如何组织查询。
我最大的问题是我不知道如何把不同的查询放在一起,在一个查询。我觉得与计数,CASE结束和左连接是可行的。我只是不能把它放在一起,似乎。
所以我的问题是:首先,我想在一个查询中实现的功能是否可以实现(如果不能使用JPA,那么使用原生查询是否可以实现)?如果可以,我做错了什么?正确的查询是什么?

sd2nnvve

sd2nnvve1#

select entryA.id as id, (array_agg(entryA.name))[1] as name, (array_agg(entryA.age))[1] as age, (array_agg(entryA.status))[1] as status
from tableA entryA
inner join tableB entryB on entryA.id = entryB.id
group by entryA.id having 'country1'= any(array_agg(entryB.country)) 
and array_length(array_agg(entryB.country),1) = 1

您可以将上述查询用于您任务

相关问题