Compare commits

..

3 Commits

Author SHA1 Message Date
Vincent Guillet
14d1264091 Disable SQL logging in Hibernate configuration 2025-05-15 15:25:05 +02:00
Vincent Guillet
0f8f09e0d7 Update docker-compose to expose MySQL on port 3366 2025-05-15 15:24:59 +02:00
Vincent Guillet
7c89d637f7 Add Article service and DAO with criteria-based search functionality 2025-05-15 15:24:46 +02:00
6 changed files with 64 additions and 15 deletions

View File

@@ -8,8 +8,8 @@ services:
MYSQL_DATABASE: testdb
MYSQL_USER: user
MYSQL_PASSWORD: password
# ports:
# - "3306:3306"
ports:
- "3366:3306"
volumes:
- mysql_data:/var/lib/mysql
@@ -26,13 +26,5 @@ services:
DB_USER: user
DB_PASSWORD: password
volumes:
mysql_data:

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,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<Article,Long> {
import java.util.List;
import java.util.Optional;
public class ArticleDao extends GenericDaoImpl<Article, Long> {
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<Article,Long> {
}
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<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);
}
}

View File

@@ -14,7 +14,7 @@
<property name="hibernate.hbm2ddl.auto">update</property>
<property name="hibernate.show_sql">true</property>
<property name="hibernate.show_sql">false</property>
<property name="hibernate.format_sql">true</property>
<mapping class="com.humanbooster.model.User"/>
<mapping class="com.humanbooster.model.Article"/>