我有两个表(请求和 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"
但对于以上查询,它不返回任何请求
有人可以帮我吗
答案 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”是一个好主意,而不是插入新记录。这样会更安全,查询也会更简单,更快(您不需要子查询)。这样还可以避免可能导致请求最终具有多个冲突状态的错误。