微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在 postgres 和 Hibernate/Spring 中使用 LIMIT 子句

如何解决如何在 postgres 和 Hibernate/Spring 中使用 LIMIT 子句

我有这个在我的 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,但也不起作用

解决方法

那是因为,根据我对文档的正确理解,postgres 不支持在 LIMIT 语句中使用 delete。因此,您可以尝试使用变通方法来实现您的要求。例如,通过在 delete 语句中使用子查询来获取要删除的行。由于我不知道您的表格设计,因此我使用 postgres 中的 CTID 来标识要删除的行。

取自文档 (https://www.postgresql.org/docs/8.2/ddl-system-columns.html)

ctid 行版本在其表中的物理位置。请注意,尽管 ctid 可用于非常快速地定位行版本,但每次被 VACUUM FULL 更新或移动时,行的 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);
,

Postgres DELETE 语句不支持 LIMIT。

https://www.postgresql.org/docs/9.3/sql-delete.html

利用 where 来删除所需的行。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。