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

@@ -41,14 +41,8 @@ public class App {
userService.createUser(user); userService.createUser(user);
List<Article> articles = articleService.findArticlesByCriteria("test", 3L); articleService.findArticlesByCriteria("test", 3L, 1, 1).forEach(article -> {
System.out.println("\nArticle trouvé :" + article.toString());
articles.forEach(article -> {
System.out.println("\nArticle trouvé :");
System.out.println("ID: " + article.getId());
System.out.println("Titre: " + article.getTitle());
System.out.println("Contenu: " + article.getContent());
System.out.println("Auteur: " + article.getAuthor().getName());
} }
); );
} }

View File

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

View File

@@ -58,4 +58,16 @@ public class Article {
public void setAuthor(User author) { public void setAuthor(User author) {
this.author = author; this.author = author;
} }
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("Article ID: ").append(id).append("\n");
sb.append("Title: ").append(title).append("\n");
sb.append("Content: ").append(content).append("\n");
sb.append("Author: ").append(author != null ? author.getName() : "Unknown").append("\n");
return sb.toString();
}
} }

View File

@@ -4,7 +4,6 @@ import com.humanbooster.dao.ArticleDao;
import com.humanbooster.model.Article; import com.humanbooster.model.Article;
import java.util.List; import java.util.List;
import java.util.Optional;
public class ArticleService { public class ArticleService {
@@ -42,7 +41,7 @@ public class ArticleService {
return articleDao.findByTitle(title); return articleDao.findByTitle(title);
} }
public List<Article> findArticlesByCriteria(String keyword, Long authorId) { public List<Article> findArticlesByCriteria(String keyword, Long authorId, int page, int size) {
return articleDao.findByCriteria(keyword, authorId); return articleDao.findByCriteria(keyword, authorId, page, size);
} }
} }