让所有未决请求一对多映射

问题描述 投票:3回答:1

我有两个表(请求和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

任何人都可以请帮我在这

java spring-data-jpa jpa-2.0 hibernate-5.x
1个回答
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

子查询可以确保只有一个请求这意味着它不仅是“待定”,并没有被批准或拒绝入境。


在第二种情况下你得到任何回报,因为就表示状态应该是“待处理”和“已核准”,同时,这将永远是假的。

如果你想获得这都是“待定”和“认可”的条目,那么你可以做这样的事情

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的记录,并为“批准”的状态存在,这就是为什么你会使用计数,你已经从以前的部分有数据。


注意:这将是从更新请求的状态是个好主意“待定”到“已批准”或“拒绝”,而不是插入新记录。这将是更安全,查询会更简单,更快(你不需要的子查询)。这也将避免在请求最终有多个相互冲突的状态可能的错误。

© www.soinside.com 2019 - 2024. All rights reserved.