获取所有挂起的请求一对多映射

时间:2019-02-06 06:50:02

标签: java spring-data-jpa jpa-2.0 hibernate-5.x

我有两个表(请求 requests_details ),如下所示。 请求表具有request_id和请求名称,而 requests_details 具有请求处于待处理,已批准或已拒绝的详细信息。我已经使用Spring JPA在一对多映射中实现了以下两个表。在 requests_details 表中,如果除了请求的待处理状态之外还有第二个条目,则意味着从状态中我们可以知道请求是已批准还是被拒绝

现在我需要分别获取所有待处理和批准请求

我编写了如下所示的hql查询

用于获取所有待处理的请求

SELECT request.name, details.* 
FROM requests request JOIN request_details details ON request.request_id=details.request_id 
WHERE 
details.status = "PENDING" AND 
details.status !="APPROVED" OR details.status !="REJECTED"

但对于上述查询,它会返回所有请求

用于获取所有已批准的请求

SELECT request.name, details.* 
FROM requests request JOIN request_details details ON request.request_id=details.request_id 
WHERE 
details.status = "PENDING" AND 
details.status ="APPROVED"

但对于以上查询,它不返回任何请求

enter image description here

我的预期结果如下所示

enter image description here

enter image description here

有人可以帮我吗

1 个答案:

答案 0 :(得分:2)

第一个查询中发生的情况是,您声明状态应该为“待处理”,并且“已批准”(涵盖“已拒绝”)或“已拒绝”(涵盖了)其他所有情况),这就是为什么您得到所有​​东西的原因。

如果您尝试获取所有“待处理”,则只需

SELECT
  request.id,
  details.*
FROM requests request
  JOIN request_details details ON request.request_id = details.request_id
WHERE details.status = "PENDING"
AND (SELECT count(*) FROM requests_details
     WHERE requests_details.request_id = request.request_id) = 1

该子查询确保该请求只有一个条目,这意味着它仅是“ PENDING”且未被批准或拒绝。


在第二种情况下,您没有得到任何回报,因为您声明状态应同时为“待处理” “已批准”,并且始终为假。

如果您想同时获得“正在等待”和“已批准”的条目,则可以执行以下操作

SELECT
  request.request_id,
  details.*
FROM requests request
  JOIN requests_details details ON request.request_id = details.request_id
WHERE details.status = 'PENDING'
  AND (SELECT count(*) FROM requests_details
         WHERE requests_details.request_id = request.request_id
           AND requests_details.status = 'APPROVED'
      ) = 1

发生的情况是,您找到了所有“待处理”请求,然后确保这些请求也被“已批准”。这是通过子查询完成的。在那里,您只需要知道ID为正确且状态为“ APPROVED”的记录就存在,这就是为什么要使用计数(即上一部分中已有的数据)的原因。


注意:将请求的状态从“ PENDING”更新为“ APPROVED”或“ REJECTED”是一个好主意,而不是插入新记录。这样会更安全,查询也会更简单,更快(您不需要子查询)。这样还可以避免可能导致请求最终具有多个冲突状态的错误。