From 7c89d637f7c8796717477b951c0ff54cc2279888 Mon Sep 17 00:00:00 2001 From: Vincent Guillet Date: Thu, 15 May 2025 15:24:46 +0200 Subject: [PATCH] Add Article service and DAO with criteria-based search functionality --- .../src/main/java/com/humanbooster/App.java | 14 ++++++ .../java/com/humanbooster/dao/ArticleDao.java | 45 +++++++++++++++++-- .../java/com/humanbooster/model/Article.java | 1 - .../humanbooster/service/ArticleService.java | 5 +++ 4 files changed, 61 insertions(+), 4 deletions(-) diff --git a/hibernate-project/src/main/java/com/humanbooster/App.java b/hibernate-project/src/main/java/com/humanbooster/App.java index ee856d2..69f9e42 100644 --- a/hibernate-project/src/main/java/com/humanbooster/App.java +++ b/hibernate-project/src/main/java/com/humanbooster/App.java @@ -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 existingUsers = userService.getAllUsers(); existingUsers.forEach(u -> userService.deleteUser(u.getId())); userService.createUser(user); + + List
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()); + } + ); } } \ No newline at end of file diff --git a/hibernate-project/src/main/java/com/humanbooster/dao/ArticleDao.java b/hibernate-project/src/main/java/com/humanbooster/dao/ArticleDao.java index ed38847..72aafb3 100644 --- a/hibernate-project/src/main/java/com/humanbooster/dao/ArticleDao.java +++ b/hibernate-project/src/main/java/com/humanbooster/dao/ArticleDao.java @@ -1,17 +1,22 @@ 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; -public class ArticleDao extends GenericDaoImpl { +import java.util.List; +import java.util.Optional; + +public class ArticleDao extends GenericDaoImpl { public ArticleDao(SessionFactory sessionFactory) { super(sessionFactory, Article.class); } public Article findByAuthor(String author) { - try(Session session = sessionFactory.openSession()){ + try (Session session = sessionFactory.openSession()) { session.beginTransaction(); Article article = session.createQuery("FROM Article WHERE author = :author", Article.class) .setParameter("author", author) @@ -22,7 +27,7 @@ public class ArticleDao extends GenericDaoImpl { } public Article findByTitle(String title) { - try(Session session = sessionFactory.openSession()){ + try (Session session = sessionFactory.openSession()) { session.beginTransaction(); Article article = session.createQuery("FROM Article WHERE title = :title", Article.class) .setParameter("title", title) @@ -31,4 +36,38 @@ public class ArticleDao extends GenericDaoImpl { return article; } } + + public List
findByCriteria(String keyword, Long authorId) { + + Optional optKeyword = Optional.ofNullable(keyword); + Optional optAuthorId = Optional.ofNullable(authorId); + + List
articles; + + try (Session session = sessionFactory.openSession()) { + session.beginTransaction(); + + CriteriaBuilder cb = session.getCriteriaBuilder(); + CriteriaQuery
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; + } } diff --git a/hibernate-project/src/main/java/com/humanbooster/model/Article.java b/hibernate-project/src/main/java/com/humanbooster/model/Article.java index ba83824..3342db7 100644 --- a/hibernate-project/src/main/java/com/humanbooster/model/Article.java +++ b/hibernate-project/src/main/java/com/humanbooster/model/Article.java @@ -1,7 +1,6 @@ package com.humanbooster.model; import jakarta.persistence.*; -import org.jetbrains.annotations.NotNull; @Entity public class Article { diff --git a/hibernate-project/src/main/java/com/humanbooster/service/ArticleService.java b/hibernate-project/src/main/java/com/humanbooster/service/ArticleService.java index a2278d1..3fbbedb 100644 --- a/hibernate-project/src/main/java/com/humanbooster/service/ArticleService.java +++ b/hibernate-project/src/main/java/com/humanbooster/service/ArticleService.java @@ -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
findArticlesByCriteria(String keyword, Long authorId) { + return articleDao.findByCriteria(keyword, authorId); + } }