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

Getting all pending requests one to many mappings

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

现在我有一个要求,分别获取所有待处理和批准的请求

我写了如下所示的 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"

但对于上述查询,它没有返回任何请求

我的预期结果如下

谁能帮我解决这个问题

第一个查询中发生的事情是您声明状态应该是 "PENDING" 而 不是 "APPROVED"(这包括 "REJECTED") 或不 "REJECTED" (这涵盖了所有其他情况)这就是为什么你得到一切。

如果你想获得所有 "PENDING" 那么只需

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" 并且没有被批准或拒绝。


在第二种情况下,您什么也得不到,因为您声明状态应该同时为 "PENDING" "APPROVED",并且永远是假的。

如果你想获得同时为 "PENDING" 和 "APPROVED" 的条目,那么你可以这样做

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

您找到所有 "PENDING" 个请求,然后确保它们 也是 "APPROVED"。这是通过子查询完成的。在那里你只需要知道具有正确 id 和 "APPROVED" 状态的记录存在,这就是为什么你会使用计数,你已经从上一部分中获得的数据。


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