首页 > 解决方案 > 将 SQL 原生查询转换为 HQL 查询

问题描述

我有下表

订单表

  OrderId   UserId    status       orderDate
       1    101       In-Progress   30/08/20
       2    101       Completed     28/08/20
       3    101       Validating    28/08/20
       4    102       In-Progress   02/09/20
       5    102       Completed     28/08/20
       6    102       In-Progress   10/09/20
       7    103       In-Progress   12/09/20
       8    103       In-Progress   15/09/20

我正在寻找输出

  1. 所有处于“进行中”状态的订单。
  2. 对于相同的用户 ID,没有任何订单状态处于“验证中”。
  3. 具有较早 orderDate 的订单

在上述条件下,o/p 将如下所示:

OrderId   UserId    status       orderDate
      4     102     In-Progress   02/09/20
      7     103     In-Progress   12/09/20

为了实现这一点,我在本机查询下面写了我想转换为 HQL 的内容。或任何简单的 HQL 查询来实现这一点?

SELECT 
    t1.*
FROM
    (SELECT 
        UserId, MIN(orderDate) AS date
    FROM
        Order
    GROUP BY UserId) t2
        INNER JOIN
    Order t1 ON t1.UserId = t2.UserId
        AND t1.orderDate = t2.date
        AND t1.UserId NOT IN (SELECT 
            UserId
        FROM
            Order
        WHERE
            status IN ('Validating'))
        AND t1.status = 'In-Progress';

标签: javasqlhibernatespring-data-jpahql

解决方案


尝试这个:

SELECT o1.*
FROM Orders o1
WHERE o1.status = 'In-Progress'
NOT EXISTS
    (SELECT 1 
    FROM Orders o2
    WHERE o2.UserId = o1.UserId
    AND o2.status = 'Validating')
AND EXISTS
   (SELECT 1
   FROM Orders o3
   WHERE o3.UserId = o1.UserId
   AND o3.orderDate > o1.orderDate)

使用第一个NOT EXISTS,您排除所有订单具有相同用户的其他订单,状态为“正在验证”

对于第二个EXISTS,您考虑存在下一个订单日期的订单(对于同一用户)

我已经命名了 Java 对象 Orders,以防止关键字 order oforder by子句出现错误


推荐阅读