Reputation: 107
I am using spring data JPA with DB2
. My first set of record is coming (i.e., index 0
). But when I do the next, it is giving me an error. I guess it may be because of DB2
. When I use index 0
it is working fine. But when I use index 1
then it is giving DataAccessException
.
Pageable pageable = new PageRequest(1, 10, Direction.ASC, "messageId");
The error occurs when using PageRequest
with an index > 0. This leads to the below error
com.ibm.db2.jcc.am.SqlSyntaxErrorException: DB2 SQL Error: SQLCODE=-199, SQLSTATE=42601, SQLERRMC=OF;??( [ DESC ASC NULLS RANGE CONCAT || / MICROSECONDS MICROSECOND, DRIVER=3.69.24
Upvotes: 6
Views: 3102
Reputation: 1609
Following Abdul Gaffar Khan's advice worked for me. Here's what I had to change:
Added my exteded DB2 Dialect to my application.properties file:
spring.jpa.properties.hibernate.dialect=com.my.package.to.MyDB2Dialect
spring.jpa.database=db2
Extended the DB2Dialect:
import org.hibernate.dialect.DB2Dialect;
import org.hibernate.dialect.pagination.AbstractLimitHandler;
import org.hibernate.dialect.pagination.LimitHandler;
import org.hibernate.dialect.pagination.LimitHelper;
import org.hibernate.engine.spi.RowSelection;
public class MyDB2Dialect extends DB2Dialect {
private static final AbstractLimitHandler MY_LIMIT_HANDLER = new AbstractLimitHandler() {
@Override
public String processSql(String sql, RowSelection selection) {
if (LimitHelper.hasFirstRow( selection )) {
//nest the main query in an outer select
return "select * from ( select inner2_.*, rownumber() over() as rownumber_ from ( "
+ sql + " fetch first " + getMaxOrLimit( selection ) + " rows only ) as inner2_ ) as inner1_ where rownumber_ > "
+ selection.getFirstRow() + " order by rownumber_";
}
return sql + " fetch first " + getMaxOrLimit( selection ) + " rows only";
}
@Override
public boolean supportsLimit() {
return true;
}
@Override
public boolean useMaxForLimit() {
return true;
}
@Override
public boolean supportsVariableLimit() {
return false;
}
};
@Override
public boolean supportsSequences() {
return false;
}
@Override
public LimitHandler getLimitHandler() {
return MY_LIMIT_HANDLER;
}
}
Upvotes: 12
Reputation: 244
Actually org.hibernate.dialect.DB2Dialect class generates invalid query that why its failing you have to correct query by overiding its method.
replace over( order by order of inner2_) with over()
Upvotes: 3