Refactor Article search functionality to support pagination and enhance output formatting

This commit is contained in:
Vincent Guillet
2025-05-15 17:14:54 +02:00
parent 14d1264091
commit bd62504d87
4 changed files with 39 additions and 32 deletions

View File

@@ -3,9 +3,12 @@ package com.humanbooster.dao;
import com.humanbooster.model.Article;
import jakarta.persistence.criteria.CriteriaBuilder;
import jakarta.persistence.criteria.CriteriaQuery;
import jakarta.persistence.criteria.Predicate;
import jakarta.persistence.criteria.Root;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
@@ -37,37 +40,36 @@ public class ArticleDao extends GenericDaoImpl<Article, Long> {
}
}
public List<Article> findByCriteria(String keyword, Long authorId) {
Optional<String> optKeyword = Optional.ofNullable(keyword);
Optional<Long> optAuthorId = Optional.ofNullable(authorId);
List<Article> articles;
public List<Article> findByCriteria(String keyword, Long authorId, int page, int size) {
try (Session session = sessionFactory.openSession()) {
session.beginTransaction();
CriteriaBuilder cb = session.getCriteriaBuilder();
CriteriaQuery<Article> query = cb.createQuery(Article.class);
var root = query.from(Article.class);
Root<Article> root = query.from(Article.class);
query.select(root);
optKeyword.ifPresent(s -> query.where(
cb.like(
cb.lower(
root.get("title")), "%" + s.toLowerCase() + "%")
));
List<Predicate> predicates = new ArrayList<>();
optAuthorId.ifPresent(l -> query.where(
cb.equal(
root.get("author"), l)
if (keyword != null && !keyword.isEmpty()) {
predicates.add(
cb.like(root.get("title"), "%" + keyword + "%")
);
}
));
if (authorId != null) {
predicates.add(
cb.equal(root.get("author").get("id"), authorId)
);
}
articles = session.createQuery(query).getResultList();
query.where(predicates.toArray(Predicate[]::new));
query.orderBy(cb.asc(root.get("title")));
return session.createQuery(query)
.setFirstResult(page * size)
.setMaxResults(size)
.getResultList();
}
return articles;
}
}