Hibernate: Paginierung mit setFirstResult und setMaxResult

Ich arbeite an einer Java-EE-Projekt, verwendet Hibernate als ORM-framework.
Um den Seitenumbruch der Ergebnisse von Abfragen, ich bin mit dem .setFirstResult und .setMaxResult Methoden (Kriterien-API).

Das problem ist, dass die erste Seite wird korrekt angezeigt, aber wenn ich auf Seite 2, habe ich das erste Ergebnis angezeigt, gleich wie das Letzte Ergebnis auf der ersten Seite.

Durch einschalten der logging-level debug habe ich es geschafft, fangen die SQL-Abfrage, Hibernate aufbaut. Sie sind:

-- First page query (results from 1 to 10)
select * from ( select this_.DT_FINE_VAL as DT1_5_0_, this_.DT_INI_VAL as DT2_5_0_, this_.CD_TIPO_PERIODO as CD3_5_0_, this_.DT_AGGIORNAMENTO as DT4_5_0_, this_.DT_INSERIMENTO as DT5_5_0_, this_.CD_USERID_AGG as CD6_5_0_, this_.CD_USERID_INS as CD7_5_0_ from GPER0_POVS2.T_POVS2_PERIODI_FUNZ this_ order by this_.CD_TIPO_PERIODO desc ) where rownum <= 10;

-- Second page query (results from 11 to 20)
select * from ( select row_.*, rownum rownum_ from ( select this_.DT_FINE_VAL as DT1_5_0_, this_.DT_INI_VAL as DT2_5_0_, this_.CD_TIPO_PERIODO as CD3_5_0_, this_.DT_AGGIORNAMENTO as DT4_5_0_, this_.DT_INSERIMENTO as DT5_5_0_, this_.CD_USERID_AGG as CD6_5_0_, this_.CD_USERID_INS as CD7_5_0_ from GPER0_POVS2.T_POVS2_PERIODI_FUNZ this_ order by this_.CD_TIPO_PERIODO desc ) row_ where rownum <= 20) where rownum_ > 10;

Scheint es, dass die zweite Abfrage "falsch" ist.
Ich bin mit Oracle als DBMS.
Könnte das ein Hibernate-bug? Kann mir jemand helfen?

Dank.

BEARBEITEN:
Dies ist der code:

Session currentSession = getCurrentSession();
Criteria criteria = currentSession.createCriteria(PeriodoFunz.class);
criteria.setResultTransformer(Criteria.ROOT_ENTITY);
Order order = paginationInfo.isAsc() ? Order.asc(paginationInfo.getOrderBy()) : Order.desc(paginationInfo.getOrderBy());
criteria.addOrder(order);
....
criteria = criteria.setFirstResult(paginationInfo.getFromRecord()).setMaxResults(paginationInfo.getPageSize());
List<PeriodoFunz> result = criteria.list();
  • Warum denkst du, dass die zweite Abfrage ist falsch? Es ist die Angabe größer als 10, so sieht es mir Recht sein.
  • Sind Sie sicher, dies ist kein Vortrag Thema ? Abfragen sieht richtig aus und hätte früher erkannt, wenn es eine Hibernate-bug !
  • Ja, scheint in Ordnung zu mir. Ist dies eine aktive Datenbank? Könnte eine neue Zeile eingefügt wurden, zwischen den beiden Abfragen? Auch, was passiert, wenn Sie die Abfragen ausführen mit sqlplus?
  • Poste bitte die Kriterien Abfrage.
  • Ja, das ist eine aktive Datenbank. Nein, eine neue Zeile wurde eingefügt zwischen den beiden Abfragen. Wenn ich die Abfragen mit Oracle SQL developer, bekomme ich, was ich am frontend (also das ist nicht eine Präsentation, Thema): in der zweiten Seite die erste richtige Folge ist durch das Letzte Ergebnis auf der ersten Seite.
InformationsquelleAutor Pietro M. | 2015-10-28
Schreibe einen Kommentar