H2 Database Oracle mode compatibility when using same query in spring MVC project

H2 database 2.2.224

Java 11.0.1

Spring Framework 4.3.8

Oracle 21c

Hi, I am using H2 database in oracle mode for test codes.

This is to enable test automation on Github Actions, as my local database is not reachable from the outside.

It is configured as such.

<!-- H2 Database Configuration -->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="org.h2.Driver"/>
        <property name="url" value="jdbc:h2:mem:testdb;MODE=Oracle;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE"/>
        <property name="username" value="sa"/>
        <property name="password" value=""/>
    </bean>

However, while many other queries work just fine in this setting, one of the queries I wrote does not work in H2 settings, although it works fine in Oracle database.

<select id="memberList" resultMap="memberMap">
        <![CDATA[
        SELECT * FROM (
            SELECT rownum as rn, mem.memberId, 
                   mem.memberPw, 
                   mem.nickname, 
                   mem.enabled,
                   mem.lastLogin,
                   mem.regDate,
                   (SELECT authority 
                    FROM (SELECT authority, ROW_NUMBER() OVER (ORDER BY CASE authority WHEN 'ROLE_ADMIN' THEN 1 WHEN 'ROLE_MEMBER' THEN 2 ELSE 3 END) as rnk
                          FROM memberAuthority auth 
                          WHERE auth.memberId = mem.memberId)
                    WHERE rnk = 1) as authority
            FROM (
                SELECT mem.memberId, 
                       mem.memberPw, 
                       mem.nickname, 
                       mem.enabled,
                       mem.lastLogin,
                       mem.regDate
                FROM member mem
        ]]>
        
        <where>
            <include refid="criteria"/>
        </where>
        
        <![CDATA[
                ORDER BY mem.memberId DESC
            ) mem
            WHERE rownum <= #{pageNum} * #{amount}
        )
        WHERE rn > (#{pageNum} - 1) * #{amount}
        ]]>
</select>

<sql id="criteria">
    <choose>
        <when test="type == 'N'.toString()">
            nickname LIKE '%' || #{keyword} || '%'
        </when>
        <when test="type == 'E'.toString()">
            memberId LIKE '%' || #{keyword} || '%'
        </when>
    </choose>
</sql>

This is the test code I made:

@Transactional
@Test
public void readMembersTest() {
    //given
    MemberDTO mDto = new MemberDTO();
    Criteria cri = new Criteria();
        
    //when
            
    mDto.setMemberId("[email protected]");
    mDto.setMemberPw("999999");
    mDto.setNickname("member1");
            
    service.join(mDto);
            
    mDto.setMemberId("[email protected]");
        mDto.setMemberPw("999999");
        mDto.setNickname("member2");
            
        service.join(mDto);
        
    List<MemberDTO> members = service.memberList(cri);
        
    //then
    Assertions.assertThat(members.size()).isEqualTo(2);
}

This is the error I get:

### Error querying database.  Cause: org.h2.jdbc.JdbcSQLSyntaxErrorException: Column "MEM.MEMBERID" not found; SQL statement:
SELECT * FROM (
            SELECT rownum as rn, mem.memberId, 
                   mem.memberPw, 
                   mem.nickname, 
                   mem.enabled,
                   mem.lastLogin,
                   mem.regDate,
                   (SELECT authority 
                    FROM (SELECT authority, ROW_NUMBER() OVER (ORDER BY CASE authority WHEN 'ROLE_ADMIN' THEN 1 WHEN 'ROLE_MEMBER' THEN 2 ELSE 3 END) as rnk
                          FROM memberAuthority auth 
                          WHERE auth.memberId = mem.memberId)
                    WHERE rnk = 1) as authority
            FROM (
                SELECT mem.memberId, 
                       mem.memberPw, 
                       mem.nickname, 
                       mem.enabled,
                       mem.lastLogin,
                       mem.regDate
                FROM member mem
         
        
          
        
         
                ORDER BY mem.memberId DESC
            ) mem
            WHERE rownum <= ? * ?
        )
        WHERE rn > (? - 1) * ? [42122-224]
### The error may exist in file [C:UsershanulgitPlantTycoonplanttycoontargetclassesmappersMemberMapper.xml]
### The error may involve kr.co.planttycoon.mapper.MemberMapper.memberList
### The error occurred while executing a query
### SQL: SELECT * FROM (             SELECT rownum as rn, mem.memberId,                     mem.memberPw,                     mem.nickname,                     mem.enabled,                    mem.lastLogin,                    mem.regDate,                    (SELECT authority                      FROM (SELECT authority, ROW_NUMBER() OVER (ORDER BY CASE authority WHEN 'ROLE_ADMIN' THEN 1 WHEN 'ROLE_MEMBER' THEN 2 ELSE 3 END) as rnk                           FROM memberAuthority auth                            WHERE auth.memberId = mem.memberId)                     WHERE rnk = 1) as authority             FROM (                 SELECT mem.memberId,                         mem.memberPw,                         mem.nickname,                         mem.enabled,                        mem.lastLogin,                        mem.regDate                 FROM member mem                                                                  ORDER BY mem.memberId DESC             ) mem             WHERE rownum <= ? * ?         )         WHERE rn > (? - 1) * ?
### Cause: org.h2.jdbc.JdbcSQLSyntaxErrorException: Column "MEM.MEMBERID" not found; SQL statement:
SELECT * FROM (
            SELECT rownum as rn, mem.memberId, 
                   mem.memberPw, 
                   mem.nickname, 
                   mem.enabled,
                   mem.lastLogin,
                   mem.regDate,
                   (SELECT authority 
                    FROM (SELECT authority, ROW_NUMBER() OVER (ORDER BY CASE authority WHEN 'ROLE_ADMIN' THEN 1 WHEN 'ROLE_MEMBER' THEN 2 ELSE 3 END) as rnk
                          FROM memberAuthority auth 
                          WHERE auth.memberId = mem.memberId)
                    WHERE rnk = 1) as authority
            FROM (
                SELECT mem.memberId, 
                       mem.memberPw, 
                       mem.nickname, 
                       mem.enabled,
                       mem.lastLogin,
                       mem.regDate
                FROM member mem
         
        
          
        
         
                ORDER BY mem.memberId DESC
            ) mem
            WHERE rownum <= ? * ?
        )
        WHERE rn > (? - 1) * ? [42122-224]
; bad SQL grammar []; nested exception is org.h2.jdbc.JdbcSQLSyntaxErrorException: Column "MEM.MEMBERID" not found; SQL statement:
SELECT * FROM (
            SELECT rownum as rn, mem.memberId, 
                   mem.memberPw, 
                   mem.nickname, 
                   mem.enabled,
                   mem.lastLogin,
                   mem.regDate,
                   (SELECT authority 
                    FROM (SELECT authority, ROW_NUMBER() OVER (ORDER BY CASE authority WHEN 'ROLE_ADMIN' THEN 1 WHEN 'ROLE_MEMBER' THEN 2 ELSE 3 END) as rnk
                          FROM memberAuthority auth 
                          WHERE auth.memberId = mem.memberId)
                    WHERE rnk = 1) as authority
            FROM (
                SELECT mem.memberId, 
                       mem.memberPw, 
                       mem.nickname, 
                       mem.enabled,
                       mem.lastLogin,
                       mem.regDate
                FROM member mem
         
        
          
        
         
                ORDER BY mem.memberId DESC
            ) mem
            WHERE rownum <= ? * ?
        )
        WHERE rn > (? - 1) * ? [42122-224], mergedContextConfiguration = [MergedContextConfiguration@3cd26422 testClass = MemberJoinTest, locations = '{file:src/test/resources/root-context-test.xml, file:src/main/webapp/WEB-INF/spring/security-context.xml}', classes = '{}', contextInitializerClasses = '[]', activeProfiles = '{}', propertySourceLocations = '{}', propertySourceProperties = '{}', contextCustomizers = set[[empty]], contextLoader = 'org.springframework.test.context.support.DelegatingSmartContextLoader', parent = [null]]].
INFO : org.springframework.context.support.GenericApplicationContext - Closing org.springframework.context.support.GenericApplicationContext@3e6ef8ad: startup date [Wed Jul 03 18:05:45 KST 2024]; root of context hierarchy

I could not find someone with a similar problem. it does say mem.memberId not found, but I don’t get why it doesn’t. Maybe It’s just a compatibility problem?

Since I’m new to programming, all I could do was ask chatGPT about the issue and search it on internet. Still no clue. At least I know that same SQL works fine in Oracle Database. Maybe I should consider different approach than using in-Memory database like H2?

New contributor

Sangjun Lee is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.

Trang chủ Giới thiệu Sinh nhật bé trai Sinh nhật bé gái Tổ chức sự kiện Biểu diễn giải trí Dịch vụ khác Trang trí tiệc cưới Tổ chức khai trương Tư vấn dịch vụ Thư viện ảnh Tin tức - sự kiện Liên hệ Chú hề sinh nhật Trang trí YEAR END PARTY công ty Trang trí tất niên cuối năm Trang trí tất niên xu hướng mới nhất Trang trí sinh nhật bé trai Hải Đăng Trang trí sinh nhật bé Khánh Vân Trang trí sinh nhật Bích Ngân Trang trí sinh nhật bé Thanh Trang Thuê ông già Noel phát quà Biểu diễn xiếc khỉ Xiếc quay đĩa Dịch vụ tổ chức sự kiện 5 sao Thông tin về chúng tôi Dịch vụ sinh nhật bé trai Dịch vụ sinh nhật bé gái Sự kiện trọn gói Các tiết mục giải trí Dịch vụ bổ trợ Tiệc cưới sang trọng Dịch vụ khai trương Tư vấn tổ chức sự kiện Hình ảnh sự kiện Cập nhật tin tức Liên hệ ngay Thuê chú hề chuyên nghiệp Tiệc tất niên cho công ty Trang trí tiệc cuối năm Tiệc tất niên độc đáo Sinh nhật bé Hải Đăng Sinh nhật đáng yêu bé Khánh Vân Sinh nhật sang trọng Bích Ngân Tiệc sinh nhật bé Thanh Trang Dịch vụ ông già Noel Xiếc thú vui nhộn Biểu diễn xiếc quay đĩa Dịch vụ tổ chức tiệc uy tín Khám phá dịch vụ của chúng tôi Tiệc sinh nhật cho bé trai Trang trí tiệc cho bé gái Gói sự kiện chuyên nghiệp Chương trình giải trí hấp dẫn Dịch vụ hỗ trợ sự kiện Trang trí tiệc cưới đẹp Khởi đầu thành công với khai trương Chuyên gia tư vấn sự kiện Xem ảnh các sự kiện đẹp Tin mới về sự kiện Kết nối với đội ngũ chuyên gia Chú hề vui nhộn cho tiệc sinh nhật Ý tưởng tiệc cuối năm Tất niên độc đáo Trang trí tiệc hiện đại Tổ chức sinh nhật cho Hải Đăng Sinh nhật độc quyền Khánh Vân Phong cách tiệc Bích Ngân Trang trí tiệc bé Thanh Trang Thuê dịch vụ ông già Noel chuyên nghiệp Xem xiếc khỉ đặc sắc Xiếc quay đĩa thú vị
Trang chủ Giới thiệu Sinh nhật bé trai Sinh nhật bé gái Tổ chức sự kiện Biểu diễn giải trí Dịch vụ khác Trang trí tiệc cưới Tổ chức khai trương Tư vấn dịch vụ Thư viện ảnh Tin tức - sự kiện Liên hệ Chú hề sinh nhật Trang trí YEAR END PARTY công ty Trang trí tất niên cuối năm Trang trí tất niên xu hướng mới nhất Trang trí sinh nhật bé trai Hải Đăng Trang trí sinh nhật bé Khánh Vân Trang trí sinh nhật Bích Ngân Trang trí sinh nhật bé Thanh Trang Thuê ông già Noel phát quà Biểu diễn xiếc khỉ Xiếc quay đĩa
Thiết kế website Thiết kế website Thiết kế website Cách kháng tài khoản quảng cáo Mua bán Fanpage Facebook Dịch vụ SEO Tổ chức sinh nhật