che*_*wal 3 db2 spring-data spring-data-jpa spring-boot
我在db2中使用spring data jpa。我的第一套唱片来了。但是当我做下一个时,它给了我错误。我猜可能是因为db2。当我使用索引0时,它工作正常。但是,当我使用索引1时,它给出了数据访问异常。
在第二页上,我遇到以下错误,这是我的可分页对象
Pageable pageable = new PageRequest(2,10,Direction.ASC,“ messageId”),由于此2(正在提及索引应为0),因此抛出以下错误
com.ibm.db2.jcc.am.SqlSyntaxErrorException:DB2 SQL错误:SQLCODE = -199,SQLSTATE = 42601,SQLERRMC = OF; ??([DESC ASC NULLS RANGE CONCAT || / MICROSECONDS MICROSECOND,DRIVER = 3.69.24
遵循Abdul Gaffar Khan的建议对我有用。这是我必须更改的内容:
将我已使用的DB2方言添加到我的application.properties文件中:
spring.jpa.properties.hibernate.dialect=com.my.package.to.MyDB2Dialect
spring.jpa.database=db2
Run Code Online (Sandbox Code Playgroud)
扩展了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;
}
}
Run Code Online (Sandbox Code Playgroud)
小智 2
实际上 org.hibernate.dialect.DB2Dialect 类会生成无效的查询,这就是为什么它失败的原因,您必须通过覆盖其方法来纠正查询。
replace over( order by order of inner2_) with over()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
694 次 |
| 最近记录: |