트러블슈팅

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