querydsl query limit 미적용

hccho·2024년 9월 6일

서브쿼리에서 limit(1)을 통해 반환된 결과를 메인 쿼리에 반영하려고 하였으나 limit이 반영되지 않았다.

이유는 쿼리가 실행 시, JPQLSerializer를 사용하여 싱글쿼리 문자열이 빌드가 되는데 이 과정에서 서브쿼리는 적절한 처리가 이루어지지 않아 limit이 적용되지 않는다고 한다. 상세 내용은 아래와 같다.

이유 상세

JPQL의 제한 사항

  • 데이터베이스 독립성: JPQL은 데이터베이스 독립적인 쿼리 언어로 설계되어 있어, SQL의 데이터베이스-specific 기능(예: LIMIT, OFFSET 등)을 직접 사용할 수 없다. 이는 JPQL이 여러 데이터베이스에서 일관되게 동작하도록 하기 위함이다.
  • 쿼리 최적화: JPQL은 JPA (Java Persistence API) 사양의 일부로, JPA 구현체가 쿼리 실행 시 데이터베이스 방언에 맞게 최적화하는 방식을 따른다. 직접적인 LIMIT 절 사용은 이 최적화 과정에 영향을 줄 수 있다.
  • 표준 SQL과의 차이: JPQL은 SQL과 유사하지만, SQL의 모든 기능을 포함하지는 않는다. JPQL은 객체 지향적인 쿼리 언어로, JPA 엔티티 객체를 기반으로 쿼리를 작성한다. LIMIT과 같은 SQL 방언은 JPQL에 포함되지 않는다.

해결방안

방안1. 서브쿼리를 fetchOne으로 실행한 다음 결과를 where절에 반영.
방안2. limit을 대체할만한 다른 쿼리를 사용.

참고 : https://dwc04112.tistory.com/277

0개의 댓글