카테고리 없음

Postgres 및 Hibernate / Spring에서 LIMIT 절을 사용하는 방법

기록만이살길 2021. 2. 22. 07:12
반응형

Postgres 및 Hibernate / Spring에서 LIMIT 절을 사용하는 방법

1. 질문(문제점):

내 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다른 질문에서 제안한대로 시도했지만 작동하지 않습니다.

2. 해결방안:

문서를 올바르게 이해 했으므로 postgres는 LIMITin delete사용 지원하지 않기 때문 입니다. 따라서 해결 방법을 사용하여 요구 사항을 달성 할 수 있습니다. 예를 들어 delete 문 내에서 하위 쿼리를 사용하여 삭제할 행을 가져옵니다. 테이블 디자인을 모르기 CTID때문에 삭제할 행을 식별하기 위해 postgres 에서 여기를 사용하고 있습니다.

문서에서 가져옴 ( https://www.postgresql.org/docs/8.2/ddl-system-columns.html )

ctid 테이블 내 행 버전의 실제 위치. ctid를 사용하여 행 버전을 매우 빠르게 찾을 수 있지만 행의 ctid는 VACUUM FULL에 의해 업데이트되거나 이동할 때마다 변경됩니다. 따라서 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);
65883266
반응형