加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-14 19:25:45 所属栏目:Java 来源:网络整理
导读:我有两个表(requests和requests_details),如下所示.请求表具有request_id,请求名称,requests_details具有请求处于待处理,已批准还是已拒绝的详细信息.我已经使用Spring JPA在一对多映射中实现了以下两个表.在requests_details表中,如果除了请求的“挂起”状

我有两个表(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"

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

enter image description here

我的预期结果如下

enter image description here

enter image description here

有人可以帮我吗

最佳答案
在第一个查询中发生的情况是,您声明状态应该为“待处理”,而不是“已批准”(涵盖“已拒绝”)或“已拒绝”(涵盖所有其他情况),这就是您得到所有??内容的原因.

如果您尝试获取所有“待处理”,则只需

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”是一个好主意,而不是插入新记录.这样会更安全,查询也会更简单,更快(您不需要子查询).这还将避免可能的错误,使请求最终具有多个冲突状态.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读