카테고리 없음
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