最近,我正在使用Junit使用hsqldb(2.3.3)测试与Dao相关的代码。系统使用mybatis进行数据持久化。
在mybatisxsql.xml中,select语句中有“fetchSize”属性,如:

<select ... resultSetType="FORWARD_ONLY" fetchSize="-2147483648">
    ...
</select>

当我们调用tested the sql with hsqldb时,它显示以下异常:
Caused by: java.sql.SQLException: Invalid argument in JDBC call
    at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
    at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
    at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
    at org.hsqldb.jdbc.JDBCUtil.outOfRangeArgument(Unknown Source)
    at org.hsqldb.jdbc.JDBCPreparedStatement.setFetchSize(Unknown Source)

我检查过它似乎不支持内存数据库中的“fetchSize”,有人能给我一些建议,我如何测试这个sql部分吗?

最佳答案

JDBC阴性fetchSizenot supported。以下是setFetchSize引发的异常的描述:
SQLException-如果发生数据库访问错误,则对已关闭的语句调用此方法,或者不满足条件行>=0。
错误的原因是获取大小不正确(堆栈跟踪中的outOfRangeArgument也表明了这一点)。
mysql驱动程序确实支持Integer.MIN_INT作为fetch size来指定结果集处于流模式:
一个只读的前向结果集和一个取回大小为Integer.MIN_VALUE的结果集的组合将作为一个信号发送给驱动程序,以逐行传输结果集。在此之后,使用该语句创建的任何结果集都将逐行检索。
mybatis本身不允许在mapper配置中参数化fetchSize
您需要使用一些技术来通过AspectJPowerMock覆盖配置。使用PowerMock可以在调用执行查询的方法之前使用PowerMock.stub执行类似的操作:

PowerMock.stub(
   PowerMock.method(
       org.apache.ibatis.mapping.MappedStatement.class,
       "getFetchSize"
   )
).toReturn(1);

这样,当mybatis将创建一个Statement时,它将为fetchSize使用模拟值

10-05 19:35