【问题标题】:Getting all pending requests one to many mappings获取所有挂起的请求一对多映射
【发布时间】:2019-02-06 06:50:01
【问题描述】:

我有两个表(requestsrequests_details),如下所示。 requests 表包含 request_id 和请求名称,requests_details 包含请求是否处于待处理、已批准或已拒绝的详细信息。我已经使用 Spring JPA 在一对多映射中实现了以下两个表。在 requests_details 表中,如果请求除了 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"

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

我的预期结果如下所示

谁能帮我解决这个问题

【问题讨论】:

  • 我不确定你想要得到什么,但details.status = "PENDING" AND details.status ="APPROVED" 显然不可能满足,details.status = "PENDING" AND details.status !="APPROVED" OR details.status !="REJECTED" 相当于(details.status = "PENDING" AND details.status !="APPROVED") OR details.status !="REJECTED" 相当于details.status = "PENDING" OR details.status !="REJECTED" 相当于@给定示例数据中的所有行都满足 987654333@。

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


【解决方案1】:

第一个查询中发生的情况是,您声明状态应该是“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”的条目,那么您可以这样做

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 和“已批准”状态的记录存在,这就是您要使用计数的原因,即您已经从上一部分获得的数据。


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

【讨论】:

  • 感谢您的回复,实际上您的 PENDING 查询返回给我完整的请求,其中包括已批准的请求。我已经用预期的结果更新了我的问题。你能看一下吗
  • @AlexMan 所以你的意思是它应该只是“PENDING”而不是别的吧?我误解了。
  • @AlexMan 我更新了答案,希望它是你想要的。不要忘记对其进行测试,也许您必须稍微调整一下,毕竟我是在没有 IDE 的情况下编写的,并且从未运行过它。另外,如果它对您有所帮助,请不要忘记投票并接受它:)
猜你喜欢
  • 2012-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-27
  • 1970-01-01
  • 1970-01-01
  • 2015-07-22
  • 1970-01-01
相关资源
最近更新 更多