获取所有挂起的请求一对多映射
Getting all pending requests one to many mappings
我有两个 table(requests 和 requests_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" 而不是插入新记录。这会更安全并且查询会更简单和更快(您不需要子查询)。它还可以避免请求最终具有多个冲突状态的可能错误。
我有两个 table(requests 和 requests_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" 而不是插入新记录。这会更安全并且查询会更简单和更快(您不需要子查询)。它还可以避免请求最终具有多个冲突状态的可能错误。