如何在postgres和hibernate/spring中使用limit子句

zbsbpyhn  于 2021-07-24  发布在  Java
关注(0)|答案(2)|浏览(446)

我有一个本机查询在我的dao中不起作用

@Query(
            nativeQuery = true,
            value = "DELETE FROM products_in_carts WHERE cart_id =?1 AND product_name = ?2 LIMIT= 1"
    )
    void removeProduct(long id, String productName);

返回: org.postgresql.util.PSQLException: ERROR: syntax error at or near "LIMIT" 我试过了 OFFSET 如其他问题所建议,但也不起作用

oknwwptz

oknwwptz1#

这是因为,正如我正确理解的文档,postgres不支持使用 LIMITdelete 声明。因此,您可以尝试使用变通方法来实现您的需求。例如,通过在delete语句中使用子查询来获取要删除的行。因为我不知道你的table设计我用的是 CTID 这里从postgres中找出要删除的行。
取自文件(https://www.postgresql.org/docs/8.2/ddl-system-columns.html)
ctid行版本在其表中的物理位置。请注意,尽管ctid可以很快定位行版本,但行的ctid在每次更新或移动时都会发生变化。因此,ctid作为长期行标识符是无用的。应该使用oid,或者更好的是用户定义的序列号来标识逻辑行。
例如(未测试):

@Query(
        nativeQuery = true,
        value = "DELETE FROM products_in_carts WHERE ctid in (select ctid from product cart_id =?1 AND product_name = ?2 LIMIT= 1)"
)
void removeProduct(long id, String productName);
wkftcu5l

wkftcu5l2#

postgres delete语句不支持limit。
https://www.postgresql.org/docs/9.3/sql-delete.html
利用where删除所需的行。

相关问题