Java Academy · Les

Paginering, sortering en projecties

Geef gepagineerde resultaten terug met Pageable, sorteer dynamisch en gebruik interfaceprojecties om het aantal opgehaalde kolommen te beperken.

Les 4 van 413 stappen

Paginering, sortering en projecties is een gratis Java Academy-les op CoddyKit. Dit is les 4 van 4. Je kunt de volledige les hieronder gratis lezen en daarna in de browser praktisch oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject Java Academy. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus Java Academy bevat in totaal 4 lessen.

Waarom paginering?

Duizenden rijen in één query teruggeven verspilt geheugen en bandbreedte. Met paginering laad je één pagina tegelijk. Spring Data integreert paginering met de abstractie Pageable.

Pageable en PageRequest

Maak een Pageable met PageRequest.of(page, size). Geef deze door aan elke repositorymethode die Page<T> teruggeeft.

Pageable pageable = PageRequest.of(0, 20); // page 0, 20 per page
Page<User> page = userRepo.findAll(pageable);
System.out.println("Total: " + page.getTotalElements());
System.out.println("Pages: " + page.getTotalPages());
System.out.println("Content: " + page.getContent().size());

Sorteren met PageRequest

Voeg sortering toe aan PageRequest met een object van het type Sort. Combineer meerdere velden met Sort.by().and().

Pageable sorted = PageRequest.of(0, 20,
    Sort.by(Sort.Direction.DESC, "createdAt")
        .and(Sort.by("name")));
Page<User> page = userRepo.findAll(sorted);

Slice versus Page

Page<T> voert een COUNT-query uit om het totale aantal pagina's te berekenen. Slice<T> doet dat niet — die weet alleen of er een volgende pagina is. Gebruik Slice voor oneindig scrollen wanneer het totale aantal niet nodig is.

public interface UserRepository extends JpaRepository<User, Long> {
    Slice<User> findByStatus(UserStatus status, Pageable pageable);
}

Integratie met Spring MVC

Spring MVC leidt Pageable automatisch af uit queryparameters: ?page=0&size=20&sort=name,asc. Handmatig parseren is niet nodig.

@GetMapping("/users")
public Page<UserDto> list(Pageable pageable) {
    return userRepo.findAll(pageable).map(UserDto::from);
}
// GET /users?page=0&size=10&sort=name,asc

Projecties met interfaces

Definieer een interface met gettermethoden die overeenkomen met de veldnamen van de entiteit. Spring Data geeft alleen die kolommen terug — zo beperk je de gegevensoverdracht en verberg je interne details.

public interface UserSummary {
    Long getId();
    String getName();
    String getEmail();
}
List<UserSummary> findByStatus(UserStatus status);

Projecties op basis van een klasse (DTO)

Gebruik een DTO-record of -klasse met een constructor. Spring Data genereert een JPQL-constructor-expressie voor de geselecteerde kolommen.

public record UserDto(Long id, String name, String email) {}

@Query("SELECT new com.example.UserDto(u.id, u.name, u.email) FROM User u WHERE u.status = :s")
List<UserDto> findSummaries(@Param("s") UserStatus status);

Dynamische projecties

Geef het projectietype als generieke parameter door aan de repositorymethode om de projectie op de aanroepplek te kiezen.

public interface UserRepository extends JpaRepository<User, Long> {
    <T> List<T> findByStatus(UserStatus status, Class<T> type);
}
// Usage:
List<UserSummary> summaries = repo.findByStatus(ACTIVE, UserSummary.class);
List<User>        full      = repo.findByStatus(ACTIVE, User.class);

Keyset-paginering (offset versus keyset)

Offset-paginering (OFFSET N) wordt trager bij grote offsets. Keyset-paginering (met WHERE id > lastSeenId) blijft O(1), ongeacht hoe diep de pagina ligt — beter voor diepe paginering.

// Keyset pagination:
@Query("SELECT u FROM User u WHERE u.id > :lastId ORDER BY u.id LIMIT :size")
List<User> findPage(@Param("lastId") Long lastId, @Param("size") int size);

Optimalisatie van het totale aantal

Gebruik countQuery in @Query om een geoptimaliseerde count-query op te geven die dure JOINs in de hoofdquery voorkomt.

@Query(value = "SELECT u FROM User u JOIN FETCH u.orders WHERE u.status = :s",
       countQuery = "SELECT COUNT(u) FROM User u WHERE u.status = :s")
Page<User> findActiveWithOrders(@Param("s") UserStatus s, Pageable p);

ResponseEntity teruggeven met paginametagegevens

Neem paginametagegevens (totalElements, totalPages, number, size) op in de REST-reactie, zodat clients weten hoe ze moeten navigeren.

@GetMapping("/users")
public ResponseEntity<Map<String, Object>> list(Pageable p) {
    Page<UserDto> page = repo.findAll(p).map(UserDto::from);
    return ResponseEntity.ok(Map.of(
        "content", page.getContent(),
        "totalElements", page.getTotalElements(),
        "totalPages", page.getTotalPages()
    ));
}

Korte controle

Wat is het belangrijkste verschil tussen Page en Slice?

Samenvatting

Gebruik Pageable+PageRequest.of() voor offset-paginering. Spring MVC leidt Pageable af uit queryparameters. Gebruik Slice om COUNT te vermijden. Gebruik projecties met interfaces of DTO's om het aantal opgehaalde kolommen te beperken. Gebruik keyset-paginering voor grote offsets.

Gratis beginnen

Leer Java met een AI-tutor — gratis

Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.

Cursussen
104
Lessen
374

Veelgestelde vragen

Is de les “Paginering, sortering en projecties” gratis?

Ja — de volledige tekst van “Paginering, sortering en projecties” kun je hier gratis op het web lezen. Als je interactief wilt oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is, en de rest van de cursus Java Academy wilt ontgrendelen, kun je upgraden naar CoddyKit PRO. De cursus Java Academy bevat in totaal 4 lessen.

Wat leer ik in “Paginering, sortering en projecties”?

Geef gepagineerde resultaten terug met Pageable, sorteer dynamisch en gebruik interfaceprojecties om het aantal opgehaalde kolommen te beperken. Je oefent met Java Academy door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.

Heb ik ervaring nodig om met Java Academy te beginnen?

Ervaring vooraf is niet nodig. Java Academy op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 4 van 4.

Hoe lang duurt de les “Paginering, sortering en projecties”?

De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.

Kan ik code schrijven en uitvoeren in deze les over Java Academy?

Ja. Elke les over Java Academy bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.

Alle lessen in deze cursus

  1. Entiteiten mappen met JPA-annotaties
  2. Spring Data-repositories en querymethoden
  3. Een-op-veel- en veel-op-veelrelaties
  4. Paginering, sortering en projecties
← Terug naar Java Academy