2016-11-10 1 views
2

Ich verwende Federdaten jpa mit db2. Mein erster Datensatz kommt. Aber wenn ich das nächste mache, gibt es mir einen Fehler. Ich denke, es könnte wegen db2 sein. Wenn ich Index 0 verwende, funktioniert es gut. Aber wenn ich Index 1 verwende, gibt es eine Datenzugriffsausnahme.Wenn ich es mit db2 für die Seitenumbruch verwendet, gibt meine nächste Seite Fehler

Auf dem zweiten Seite erhalte ich unten Fehler meines seitenwechselbar Objekt

Pageable seitenwechselbar = new PageRequest (2, 10, Direction.ASC "messageId"), weil diese 2 (Da es diesen Index soll, ist zu erwähnen, 0) sein,

com.ibm.db2.jcc.am.SqlSyntaxErrorException: DB2 SQL Fehler: SQLCODE = -199, SQLSTATE = 42601, SQLERRMC = OF; ?? ([DESC ASC NULL RANGE CONCAT ||/MICROSECONDS MICROSECOND, TREIBER = 3.69.24

+0

Können Sie einige Beispiel nennen? –

+0

Ich benutze auslagerbare Auslagerungsdatei = neue PageRequest (OffsetValue - 1, 10, Direction.ASC, "messageId") und repository.findById (ID, auslagerbar). aber wenn ich es debugge, gibt es mir einen Fehler. Ich benutze Federdaten jpa –

+0

Ich habe meine Frage bearbeitet. –

Antwort

2

Tatsächlich generiert org.hibernate.dialect.DB2Dialect-Klasse ungültige Abfrage, warum es fehlschlägt müssen Sie korr ect-Abfrage durch Überschreiben seiner Methode.

0

Nach Abdul Gaffar Khan arbeitete der Rat für mich. Hier ist, was ich ändern musste:

hinzugefügt mein exteded DB2 Dialect meiner Datei application.properties:

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

die DB2Dialect Erweiterte:

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; 
    } 
} 
Verwandte Themen