我将如何使用 GORM 完成以下查询?
select *
from T where id in
(
SELECT id
FROM (
SELECT *
FROM T
WHERE X is NULL
ORDER BY Y DESC
)
WHERE ROWNUM <= 1
)
FOR UPDATE;
我正在尝试的方法调用如下所示:
T.findByXIsNull(sort: "Y", order:"desc", lock: true)
但是,我收到以下错误(Oracle 11gR2):ORA-02014: cannot select FOR UPDATE from view with DISTINCT, GROUP BY, etc.
我认为它失败的原因是因为 Hibernate 将其转换为以下查询:
SELECT *
FROM (
SELECT *
FROM T
WHERE X is NULL
ORDER BY Y DESC
)
WHERE ROWNUM <= 1 FOR UPDATE;
此查询尝试将 FOR UPDATE 直接应用于限制 rownum 的子句。需要一个包装器选择语句来应用 FOR UPDATE,如我在顶部的示例(并在此处讨论:如何解决 ORA-02014:无法使用 DISTINCT, GROUP BY 从视图中选择 FOR UPDATE)。如何实现?
更新1
看起来这是 GORM/Hibernate 在同时指定order by
和时生成查询的错误rownnum <= ?
。以下两项单独工作:
T.findByXIsNull(sort: "Y", order:"desc")
T.findByXIsNull(lock: true)
但是T.findByXIsNull(sort: "Y", order:"desc", lock:true)
它们一起失败并出现 ORA-02014 错误。修复方法是让 Hibernate 生成我在本文顶部描述的 SQL,它将锁包装到另一个外部 select 语句中。但是,可能有一种我不知道的解决方法。