@@ -340,6 +340,66 @@ public void testScrollingJoinFetchesReverse(SessionFactoryScope scope) {
340340 );
341341 }
342342
343+ @ Test
344+ @ RequiresDialectFeature (feature = DialectFeatureChecks .SupportsTemporaryTable .class )
345+ @ SkipForDialect (dialectClass = HANADialect .class , matchSubTypes = true , reason = "HANA only supports forward-only cursors." )
346+ public void testScrollingJoinFetchesWithNext (SessionFactoryScope scope ) {
347+ TestData data = new TestData ();
348+ data .prepare ( scope );
349+
350+ scope .inTransaction (
351+ session -> {
352+ try (ScrollableResults results = session
353+ .createQuery ("from Animal a left join fetch a.offspring where a.description like :desc order by a.id" )
354+ .setParameter ( "desc" , "root%" )
355+ .scroll ()) {
356+
357+ assertTrue ( results .next () );
358+ Animal animal = (Animal ) results .get ();
359+ assertEquals ( data .root1Id , animal .getId (), "next() did not return expected row" );
360+ assertEquals ( 1 , results .getRowNumber () );
361+
362+ assertTrue ( results .next () );
363+ animal = (Animal ) results .get ();
364+ assertEquals ( data .root2Id , animal .getId (), "next() did not return expected row" );
365+ assertEquals ( 2 , results .getRowNumber () );
366+
367+ assertFalse ( results .next () );
368+ }
369+ }
370+ );
371+ }
372+
373+ @ Test
374+ @ RequiresDialectFeature (feature = DialectFeatureChecks .SupportsTemporaryTable .class )
375+ @ SkipForDialect (dialectClass = HANADialect .class , matchSubTypes = true , reason = "HANA only supports forward-only cursors." )
376+ public void testScrollingNoJoinFetchesWithNext (SessionFactoryScope scope ) {
377+ TestData data = new TestData ();
378+ data .prepare ( scope );
379+
380+ scope .inTransaction (
381+ session -> {
382+ try (ScrollableResults results = session
383+ .createQuery ("from Animal a where a.description like :desc order by a.id" )
384+ .setParameter ( "desc" , "root%" )
385+ .scroll ()) {
386+
387+ assertTrue ( results .next () );
388+ Animal animal = (Animal ) results .get ();
389+ assertEquals ( data .root1Id , animal .getId (), "next() did not return expected row" );
390+ assertEquals ( 1 , results .getRowNumber () );
391+
392+ assertTrue ( results .next () );
393+ animal = (Animal ) results .get ();
394+ assertEquals ( data .root2Id , animal .getId (), "next() did not return expected row" );
395+ assertEquals ( 2 , results .getRowNumber () );
396+
397+ assertFalse ( results .next () );
398+ }
399+ }
400+ );
401+ }
402+
343403 @ Test
344404 @ RequiresDialectFeature (feature = DialectFeatureChecks .SupportsTemporaryTable .class )
345405 @ SkipForDialect (dialectClass = HANADialect .class , matchSubTypes = true , reason = "HANA only supports forward-only cursors." )
@@ -350,30 +410,127 @@ public void testScrollingJoinFetchesPositioning(SessionFactoryScope scope) {
350410 scope .inTransaction (
351411 session -> {
352412 try (ScrollableResults results = session
353- .createQuery (
354- "from Animal a left join fetch a.offspring where a.description like :desc order by a.id" )
413+ .createQuery ("from Animal a left join fetch a.offspring where a.description like :desc order by a.id" )
414+ .setParameter ( "desc" , "root%" )
415+ .scroll ()) {
416+
417+ results .first ();
418+ Animal animal = (Animal ) results .get ();
419+ assertEquals ( data .root1Id , animal .getId (), "first() did not return expected row" );
420+ assertEquals ( 1 , results .getRowNumber () );
421+
422+ results .scroll ( 1 );
423+ animal = (Animal ) results .get ();
424+ assertEquals ( data .root2Id , animal .getId (), "scroll(1) did not return expected row" );
425+ assertEquals ( 2 , results .getRowNumber () );
426+
427+ results .scroll ( -1 );
428+ animal = (Animal ) results .get ();
429+ assertEquals ( data .root1Id , animal .getId (), "scroll(-1) did not return expected row" );
430+ assertEquals ( 1 , results .getRowNumber () );
431+
432+ results .next ();
433+ animal = (Animal ) results .get ();
434+ assertEquals ( data .root2Id , animal .getId (), "next() did not return expected row" );
435+ assertEquals ( 2 , results .getRowNumber () );
436+
437+ results .setRowNumber ( 1 );
438+ animal = (Animal ) results .get ();
439+ assertEquals ( data .root1Id , animal .getId (), "setRowNumber(1) did not return expected row" );
440+ assertEquals ( 1 , results .getRowNumber () );
441+
442+ results .setRowNumber ( 2 );
443+ animal = (Animal ) results .get ();
444+ assertEquals ( data .root2Id , animal .getId (), "setRowNumber(2) did not return expected row" );
445+ assertEquals ( 2 , results .getRowNumber () );
446+
447+ results .setRowNumber ( -2 );
448+ animal = (Animal ) results .get ();
449+ assertEquals ( data .root1Id , animal .getId (), "setRowNumber(-2) did not return expected row" );
450+ assertEquals ( 1 , results .getRowNumber () );
451+
452+ results .setRowNumber ( -1 );
453+ animal = (Animal ) results .get ();
454+ assertEquals ( data .root2Id , animal .getId (), "setRowNumber(-1) did not return expected row" );
455+ assertEquals ( 2 , results .getRowNumber () );
456+
457+ results .position ( 1 );
458+ animal = (Animal ) results .get ();
459+ assertEquals ( data .root1Id , animal .getId (), "position(1) did not return expected row" );
460+ assertEquals ( 1 , results .getRowNumber () );
461+
462+ results .position ( 2 );
463+ animal = (Animal ) results .get ();
464+ assertEquals ( data .root2Id , animal .getId (), "position(2) did not return expected row" );
465+ assertEquals ( 2 , results .getRowNumber () );
466+ }
467+ }
468+ );
469+ }
470+
471+ @ Test
472+ @ RequiresDialectFeature (feature = DialectFeatureChecks .SupportsTemporaryTable .class )
473+ @ SkipForDialect (dialectClass = HANADialect .class , matchSubTypes = true , reason = "HANA only supports forward-only cursors." )
474+ public void testScrollingNoJoinFetchesPositioning (SessionFactoryScope scope ) {
475+ TestData data = new TestData ();
476+ data .prepare ( scope );
477+
478+ scope .inTransaction (
479+ session -> {
480+ try (ScrollableResults results = session
481+ .createQuery ("from Animal a where a.description like :desc order by a.id" )
355482 .setParameter ( "desc" , "root%" )
356483 .scroll ()) {
357484
358485 results .first ();
359486 Animal animal = (Animal ) results .get ();
360487 assertEquals ( data .root1Id , animal .getId (), "first() did not return expected row" );
488+ assertEquals ( 1 , results .getRowNumber () );
361489
362490 results .scroll ( 1 );
363491 animal = (Animal ) results .get ();
364492 assertEquals ( data .root2Id , animal .getId (), "scroll(1) did not return expected row" );
493+ assertEquals ( 2 , results .getRowNumber () );
365494
366495 results .scroll ( -1 );
367496 animal = (Animal ) results .get ();
368497 assertEquals ( data .root1Id , animal .getId (), "scroll(-1) did not return expected row" );
498+ assertEquals ( 1 , results .getRowNumber () );
499+
500+ results .next ();
501+ animal = (Animal ) results .get ();
502+ assertEquals ( data .root2Id , animal .getId (), "next() did not return expected row" );
503+ assertEquals ( 2 , results .getRowNumber () );
369504
370505 results .setRowNumber ( 1 );
371506 animal = (Animal ) results .get ();
372507 assertEquals ( data .root1Id , animal .getId (), "setRowNumber(1) did not return expected row" );
508+ assertEquals ( 1 , results .getRowNumber () );
373509
374510 results .setRowNumber ( 2 );
375511 animal = (Animal ) results .get ();
376512 assertEquals ( data .root2Id , animal .getId (), "setRowNumber(2) did not return expected row" );
513+ assertEquals ( 2 , results .getRowNumber () );
514+
515+ results .setRowNumber ( -2 );
516+ animal = (Animal ) results .get ();
517+ assertEquals ( data .root1Id , animal .getId (), "setRowNumber(-2) did not return expected row" );
518+ assertEquals ( 1 , results .getRowNumber () );
519+
520+ results .setRowNumber ( -1 );
521+ animal = (Animal ) results .get ();
522+ assertEquals ( data .root2Id , animal .getId (), "setRowNumber(-1) did not return expected row" );
523+ assertEquals ( 2 , results .getRowNumber () );
524+
525+ results .position ( 1 );
526+ animal = (Animal ) results .get ();
527+ assertEquals ( data .root1Id , animal .getId (), "position(1) did not return expected row" );
528+ assertEquals ( 1 , results .getRowNumber () );
529+
530+ results .position ( 2 );
531+ animal = (Animal ) results .get ();
532+ assertEquals ( data .root2Id , animal .getId (), "position(2) did not return expected row" );
533+ assertEquals ( 2 , results .getRowNumber () );
377534 }
378535 }
379536 );
0 commit comments