我有两个表(requests和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"
但对于上述查询,它不返回任何请求
我的预期结果如下
有人可以帮我吗
最佳答案
在第一个查询中发生的情况是,您声明状态应该为“待处理”,而不是“已批准”(涵盖“已拒绝”)或“已拒绝”(涵盖所有其他情况),这就是您得到所有内容的原因.
原文链接:https://www.f2er.com/java/532836.html如果您尝试获取所有“待处理”,则只需
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”,并且始终为假.
如果您想同时获得“正在等待”和“已批准”的条目,则可以执行以下操作
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”是一个好主意,而不是插入新记录.这样会更安全,查询也会更简单,更快(您不需要子查询).这还将避免可能的错误,使请求最终具有多个冲突状态.