Refactor Article search functionality to support pagination and enhance output formatting
This commit is contained in:
@@ -41,14 +41,8 @@ public class App {
|
||||
|
||||
userService.createUser(user);
|
||||
|
||||
List<Article> articles = articleService.findArticlesByCriteria("test", 3L);
|
||||
|
||||
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());
|
||||
articleService.findArticlesByCriteria("test", 3L, 1, 1).forEach(article -> {
|
||||
System.out.println("\nArticle trouvé :" + article.toString());
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
));
|
||||
|
||||
articles = session.createQuery(query).getResultList();
|
||||
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)
|
||||
);
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -58,4 +58,16 @@ public class Article {
|
||||
public void setAuthor(User 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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,7 +4,6 @@ import com.humanbooster.dao.ArticleDao;
|
||||
import com.humanbooster.model.Article;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
|
||||
public class ArticleService {
|
||||
|
||||
@@ -42,7 +41,7 @@ public class ArticleService {
|
||||
return articleDao.findByTitle(title);
|
||||
}
|
||||
|
||||
public List<Article> findArticlesByCriteria(String keyword, Long authorId) {
|
||||
return articleDao.findByCriteria(keyword, authorId);
|
||||
public List<Article> findArticlesByCriteria(String keyword, Long authorId, int page, int size) {
|
||||
return articleDao.findByCriteria(keyword, authorId, page, size);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user