IN 절에 들어가는 값의 개수에는 SQL과 JDBC 드라이버의 제약이 있습니다. 보통 다음과 같은 기준을 따릅니다:
---
* 일반적인 기준
DBMS 종류 IN 절 허용 최대 개수
Oracle 1000개 이하 (초과 시 OR 조건으로 분리 필요)
MySQL / MariaDB 제한 없음 (실제로는 메모리나 패킷 크기에 따라 제한 가능)
PostgreSQL 제한 없음 (단, 성능 문제 발생 가능)
SQL Server 2100개 이하 (파라미터 기준)
H2 (테스트용 DB) 기본 제한 없음
---
*Oracle의 중요한 제한
Oracle은 IN 절에 1000개 초과 항목을 넣으면:
ORA-01795: maximum number of expressions in a list is 1000
라는 에러가 발생합니다.
---
* 해결 방법
1. 1000개씩 잘라서 OR 연결
val condition = BooleanBuilder()
ids.chunked(1000).forEach { chunk ->
condition.or(qUser.id.`in`(chunk))
}
val result = queryFactory
.selectFrom(qUser)
.where(condition)
.fetch()
2. 임시 테이블에 ID 목록 넣고 JOIN
대량 ID를 미리 임시 테이블이나 CTE (with 문)로 만들어 JOIN하는 방식이 더 안정적입니다.
---
* 요약
Oracle은 반드시 1000개 제한을 주의하세요.
PostgreSQL, MySQL은 이론상 무제한이지만 너무 많으면 성능 문제가 발생할 수 있습니다.
1000개 이상이면 chunking + OR 조건 처리가 가장 일반적인 해결 방법입니다.
--
JPA에서 PostgreSQL기반으로 IN 조건 처리 시, 오류 발생 해서 끊어서 조회한 경험 있음
'skill > Java.Kotlin' 카테고리의 다른 글
| Jacoco 리포트 화면 (0) | 2025.09.16 |
|---|---|
| jacoco 개념 + 외부 연동 MockkBean 처리 (0) | 2025.09.15 |
| MinIO 403 오류 확인:access/secret key 정상 확인 (3) | 2025.07.28 |
| Kotlin UTC (3) | 2025.06.12 |
| Oracle + Kotlin + JPA 연결 (0) | 2025.06.12 |