트러블슈팅
Test 코드에서 h2 database로 MySql 쿼리 실행 시 row_number에서 syntax 에러
MJ.Lee
2024. 1. 25. 21:57
문제
MySql 조회 Query에 row_number를 사용하는 필드를 추가하고, Test Code를 돌렸는데, 아래와 같은 에러가 났다.
Caused by: org.h2.jdbc.JdbcSQLException: Syntax error in SQL statement
JOOQ로 작성한 쿼리와 실행된 SQL 쿼리는 대략 아래와 같았다.
JOOQ
Field<Integer> groupSeqField = DSL.rowNumber()
.over(partitionBy(tProduct.GROUP_CD)
.orderBy(tProduct.ID.asc()))
.as("groupSeq");
dslContext.select(
tProduct.ID,
groupSeqField
)
.from(tProduct)
.fetchInto(Product.class);
SQL
SELECT
product.id
,row_number() over (partition[*] by product.group_cd order by product.id asc) groupSeq
FROM product
테스트 코드로 돌리지 않고, 직접 API를 호출했을 때는 정상적으로 동작이 되었다.
그러나, 테스트 코드를 돌리면 row_number 필드를 추가한 부분이 계속 h2 database에서 syntax 에러가 났다.
원인
사용하고 있었던 H2 Database 버전이 row_number를 지원하지 않아 syntax 에러가 생겼다.
row_number는 H2 Database 버전 1.4.2 부터 지원한다. 내가 사용하고 있던 버전은 1.4.2보다 낮은 버전이었다.
해결
pom.xml에서 H2 Databae 버전을 1.4.2로 올려주었다.
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.4.200</version>
</dependency>
참고 자료
https://stackoverflow.com/questions/53927267/how-to-emulate-rownum-of-oracle-in-h2
How to emulate ROWNUM of Oracle in H2
I am using H2 database for testing but for production I am using Oracle. I am trying to use following query. SELECT ROWNUM as id, name, state FROM info; with following configuration public class
stackoverflow.com