0Pricing
Java Academy · Ders

Sayfalama, Sıralama ve Projeksiyonlar

Sayfalı sonuçları Pageable ile döndürün, dinamik olarak sıralayın ve getirilen sütunları sınırlamak için arayüz projeksiyonlarını kullanın.

Sayfalama, Sıralama ve Projeksiyonlar, CoddyKit'te ücretsiz bir Java Academy dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Java Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Java Academy kursu toplamda 4 dersten oluşur.

Neden Sayfalama?

Binlerce satırı tek sorguda döndürmek bellek ve bant genişliği israfına yol açar. Sayfalama, her seferinde tek bir sayfa yükler. Spring Data, sayfalamayı Pageable soyutlamasıyla bütünleştirir.

Sayfalama Nesnesi ve PageRequest

PageRequest.of(page, size) kullanarak bir Pageable oluşturun. Bunu Page<T> döndüren herhangi bir depo yöntemine geçirin.

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());

PageRequest ile Sıralama

PageRequest'e bir Sort nesnesiyle sıralama ekleyin. Birden çok alanı Sort.by().and() ile zincirleyin.

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

Dilim ve Page

Page<T>, toplam sayfa sayısını hesaplamak için bir COUNT sorgusu çalıştırır. Slice<T> bunu yapmaz; yalnızca sonraki bir sayfanın olup olmadığını bilir. Toplam sayının gerekmediği sonsuz kaydırma için Slice kullanın.

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

Spring MVC Bütünleştirmesi

Spring MVC, sorgu parametrelerinden Pageable'ı otomatik olarak çözümler: ?page=0&size=20&sort=name,asc. Elle ayrıştırma gerekmez.

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

Arayüz Projeksiyonları

Varlık alanlarının adlarıyla eşleşen alıcı yöntemlerine sahip bir arayüz tanımlayın. Spring Data yalnızca bu sütunları döndürür; böylece veri aktarımı azalır ve iç ayrıntılar gizlenir.

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

Sınıf Tabanlı (DTO) Projeksiyonlar

Bir oluşturucuya sahip bir DTO kaydı veya sınıfı kullanın. Spring Data, seçilen sütunlar için bir JPQL oluşturucu ifadesi üretir.

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);

Dinamik Projeksiyonlar

Çağrı noktasında projeksiyonu seçmek için projeksiyon türünü depo yöntemine genel tür parametresi olarak geçirin.

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);

Anahtar Kümesiyle Sayfalama (Ofset ve Anahtar Kümesi)

Ofset sayfalama (OFFSET N), büyük ofsetlerde yavaşlar. Anahtar kümesiyle sayfalama (WHERE id > lastSeenId kullanılarak), sayfa derinliğinden bağımsız olarak O(1)'dir; derin sayfalama için daha uygundur.

// 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);

Toplam Sayı Optimizasyonu

Ana sorgudaki maliyetli JOIN işlemlerinden kaçınan en iyi duruma getirilmiş bir sayı sorgusu sağlamak için @Query içinde countQuery kullanın.

@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);

Sayfa Üst Verileriyle ResponseEntity Döndürme

İstemcilerin sayfalar arasında nasıl gezineceğini bilmeleri için REST yanıtına sayfa üst verilerini (totalElements, totalPages, number, size) ekleyin.

@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()
    ));
}

Kısa Kontrol

Page ile Slice arasındaki temel fark nedir?

Özet

Ofset sayfalama için Pageable+PageRequest.of() kullanın. Spring MVC, Pageable'ı sorgu parametrelerinden çözümler. COUNT sorgusundan kaçınmak için Slice kullanın. Getirilen sütunları sınırlamak için arayüz veya DTO projeksiyonlarını kullanın. Büyük ofsetler için anahtar kümesiyle sayfalama kullanın.

Sıkça Sorulan Sorular

“Sayfalama, Sıralama ve Projeksiyonlar” dersi ücretsiz mi?

Evet — “Sayfalama, Sıralama ve Projeksiyonlar” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Java Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Java Academy kursu toplamda 4 dersten oluşur.

“Sayfalama, Sıralama ve Projeksiyonlar” dersinde ne öğreneceğim?

Sayfalı sonuçları Pageable ile döndürün, dinamik olarak sıralayın ve getirilen sütunları sınırlamak için arayüz projeksiyonlarını kullanın. Java Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

Java Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te Java Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.

“Sayfalama, Sıralama ve Projeksiyonlar” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu Java Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Java Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. JPA Ek Açıklamalarıyla Varlık Eşleme
  2. Spring Data Depoları ve Sorgu Yöntemleri
  3. Bire-Çok ve Çoka-Çok İlişkileri
  4. Sayfalama, Sıralama ve Projeksiyonlar
← Java Academy Sayfasına Dön