Add Article service and DAO with criteria-based search functionality

This commit is contained in:
Vincent Guillet
2025-05-15 15:24:46 +02:00
parent 8fd72d599d
commit 7c89d637f7
4 changed files with 61 additions and 4 deletions

View File

@@ -1,8 +1,10 @@
package com.humanbooster;
import com.humanbooster.dao.ArticleDao;
import com.humanbooster.dao.UserDao;
import com.humanbooster.model.Article;
import com.humanbooster.model.User;
import com.humanbooster.service.ArticleService;
import com.humanbooster.service.UserService;
import org.hibernate.SessionFactory;
import org.hibernate.boot.Metadata;
@@ -32,10 +34,22 @@ public class App {
));
UserService userService = new UserService(new UserDao(sessionFactory));
ArticleService articleService = new ArticleService(new ArticleDao(sessionFactory));
List<User> existingUsers = userService.getAllUsers();
existingUsers.forEach(u -> userService.deleteUser(u.getId()));
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());
}
);
}
}

View File

@@ -1,9 +1,14 @@
package com.humanbooster.dao;
import com.humanbooster.model.Article;
import jakarta.persistence.criteria.CriteriaBuilder;
import jakarta.persistence.criteria.CriteriaQuery;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import java.util.List;
import java.util.Optional;
public class ArticleDao extends GenericDaoImpl<Article, Long> {
public ArticleDao(SessionFactory sessionFactory) {
@@ -31,4 +36,38 @@ public class ArticleDao extends GenericDaoImpl<Article,Long> {
return article;
}
}
public List<Article> findByCriteria(String keyword, Long authorId) {
Optional<String> optKeyword = Optional.ofNullable(keyword);
Optional<Long> optAuthorId = Optional.ofNullable(authorId);
List<Article> articles;
try (Session session = sessionFactory.openSession()) {
session.beginTransaction();
CriteriaBuilder cb = session.getCriteriaBuilder();
CriteriaQuery<Article> query = cb.createQuery(Article.class);
var root = query.from(Article.class);
query.select(root);
optKeyword.ifPresent(s -> query.where(
cb.like(
cb.lower(
root.get("title")), "%" + s.toLowerCase() + "%")
));
optAuthorId.ifPresent(l -> query.where(
cb.equal(
root.get("author"), l)
));
articles = session.createQuery(query).getResultList();
}
return articles;
}
}

View File

@@ -1,7 +1,6 @@
package com.humanbooster.model;
import jakarta.persistence.*;
import org.jetbrains.annotations.NotNull;
@Entity
public class Article {

View File

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