2016-11-10 2 views
2

Я использую данные весны jpa с db2. Мой первый набор записей подходит. Но когда я делаю следующий, это дает мне ошибку. Я думаю, это может быть из-за db2. Когда я использую индекс 0, он работает нормально. Но когда я использую индекс 1, он предоставляет исключение доступа к данным.Когда я использую его с db2 для разбивки на страницы, моя следующая страница дает ошибку

На второй странице я получаю ошибку ниже мой выгружаемой объект

выгружаемый выгружаемый = новый 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

+0

Можете ли вы предоставить некоторые примеры? –

+0

Я использую Pageableableable = new PageRequest (offsetValue - 1, 10, Direction.ASC, "messageId") и repository.findById (id, pageable). но когда я его отлаживаю, он дает мне ошибку. Я использую данные весны jpa –

+0

Я отредактировал мой вопрос. –

ответ

2

На самом деле org.hibernate.dialect.DB2Dialect класс генерирует неверный запрос, почему его отказ от корра ect путем переопределения его метода.

replace over(order by order of inner2_) with over() 
0

Следуя совету Abdul Gaffar Khan, я работал для меня. Вот что я должен был изменить:

Добавлен мой exteded Диалектом DB2 в мой файл application.properties:

spring.jpa.properties.hibernate.dialect=com.my.package.to.MyDB2Dialect 
spring.jpa.database=db2 

Расширена 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; 
    } 
}