Skip to content

Conversation

r6hk
Copy link

@r6hk r6hk commented Aug 21, 2025

The example code in the document:

Window<User> users = repository.findFirst10ByLastnameOrderByFirstname("Doe", ScrollPosition.offset());
do {

  for (User u : users) {
    // consume the user
  }

  // obtain the next Scroll
  users = repository.findFirst10ByLastnameOrderByFirstname("Doe", users.positionAt(users.size() - 1));
} while (!users.isEmpty() && users.hasNext());

The execution result is as follows (there are slight differences from the code in the documentation, but it illustrates the point):

screenshot-20250821-170027

It can be observed that the elements with indices 10 through 14 have not been consumed.

Modified code:

ScrollPosition position = ScrollPosition.offset();
while (true) {
    users = repository.findFirst10ByLastnameOrderByFirstname("Doe", position);
    if (users.isEmpty()) break;
    for (User u : users) {
        // consume the user
    }
    if (!users.hasNext()) break;
    position = users.positionAt(users.size() - 1);
}

This code accounts for more cases, such as when the count of data is 0 or an exact multiple of 10.

  • You have read the Spring Data contribution guidelines.
  • You use the code formatters provided here and have them applied to your changes. Don’t submit any formatting related changes.
  • You submit test cases (unit or integration tests) that back your changes.
  • You added yourself as author in the headers of the classes you touched. Amend the date range in the Apache license header if needed. For new types, add the license header (copy from another file and set the current year only).

@spring-projects-issues spring-projects-issues added the status: waiting-for-triage An issue we've not yet triaged label Aug 21, 2025
@r6hk r6hk closed this Aug 21, 2025
@r6hk r6hk reopened this Aug 21, 2025
@mp911de
Copy link
Member

mp911de commented Aug 25, 2025

Thanks for bringing this up. Actually, the condition is slightly off, it should be || instead of &&, so either the result has contents or the scrolling isn't finished yet. Do you want to include the change or should we just swap the operators?

@mp911de mp911de added type: documentation A documentation update status: waiting-for-feedback We need additional information before we can continue and removed status: waiting-for-triage An issue we've not yet triaged labels Aug 25, 2025
@r6hk
Copy link
Author

r6hk commented Aug 27, 2025

Thanks for bringing this up. Actually, the condition is slightly off, it should be || instead of &&, so either the result has contents or the scrolling isn't finished yet. Do you want to include the change or should we just swap the operators?

Thank you for the feedback. It looks like simply changing the operator is the easier fix—please go ahead and change it directly. However, also note that when no results are found for the given query, users.positionAt(users.size() - 1) could throw an IndexOutOfBoundsException.

@r6hk r6hk closed this Aug 27, 2025
@r6hk r6hk reopened this Aug 27, 2025
@spring-projects-issues spring-projects-issues added status: feedback-provided Feedback has been provided and removed status: waiting-for-feedback We need additional information before we can continue labels Aug 27, 2025
@r6hk
Copy link
Author

r6hk commented Aug 27, 2025

You can still consider my code, as I believe it reduces one interaction with the database. @mp911de

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
status: feedback-provided Feedback has been provided type: documentation A documentation update
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants