Při návrhu REST API je důležité myslet na škálovatelnost a výkon. Pokud služba vrací stovky nebo tisíce záznamů najednou, zatěžuje nejen server, ale i klienta. Řešením je stránkování, řazení a filtrování – základní stavební kameny moderního API. Tento článek ukazuje, jak tyto techniky implementovat v Java EE pomocí JPA a Hibernate.
Stránkování znamená, že API nevrací všechny záznamy najednou, ale pouze omezený výřez. Nejčastěji se používá:
?offset=0&limit=20
Tím získáte prvních 20 záznamů. Tento přístup zajišťuje:
Moderní API by mělo být flexibilní – klient si může určit, podle čeho a jak má být výstup řazen nebo filtrován:
/api/products?offset=0&limit=10&sortBy=price&order=desc&filter=category:books
Řazení by mělo být kontrolováno whitelistem dostupných polí. Filtrování lze provést jednoduše pomocí klíč-hodnota párů, které se převedou do podmínek v dotazu.
Ukázka jednoduchého dotazu pomocí JPQL:
TypedQuery<Product> query = em.createQuery( "SELECT p FROM Product p WHERE p.category = :category ORDER BY p.price DESC", Product.class); query.setParameter("category", "books"); query.setFirstResult(offset); query.setMaxResults(limit); List<Product> result = query.getResultList();
Pro dynamické dotazy se hodí Criteria API
, které umožňuje vytvářet podmínky podle potřeby:
CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery<Product> cq = cb.createQuery(Product.class); Root<Product> root = cq.from(Product.class); cq.select(root); List<Predicate> predicates = new ArrayList<>(); predicates.add(cb.equal(root.get("category"), "books")); cq.where(cb.and(predicates.toArray(new Predicate[0]))); cq.orderBy(cb.desc(root.get("price"))); TypedQuery<Product> query = em.createQuery(cq); query.setFirstResult(offset); query.setMaxResults(limit);
API by mělo kromě dat obsahovat i metainformace:
{ "data": [ /* seznam produktů */ ], "pagination": { "offset": 0, "limit": 10, "total": 83, "next": "/api/products?offset=10&limit=10", "prev": null } }
To usnadňuje implementaci klientské logiky a zlepšuje navigaci mezi stránkami.
Ve SPA aplikacích se stránkování provádí pomocí AJAX volání. Příklad v Reactu:
useEffect(() => { fetch(`/api/products?offset=${offset}&limit=10`) .then(res => res.json()) .then(data => setProducts(data.data)); }, [offset]);
V Angularu použijte HttpClient a observables pre reakciu na pagináciu. Testujte:
Řazení, stránkování a filtrování jsou základní nástroje pro optimalizaci REST API. Pomáhají snížit zátěž backendu, zlepšují odezvu a zajišťují vyšší komfort při práci s daty.
Chcete-li si celý proces vyzkoušet prakticky, doporučujeme kurz Java REST služby s Hibernate a JPA, kde si osvojíte vývoj škálovatelných a efektivních REST aplikací v reálném prostředí.
Viac informacií preberáme na kurze: