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,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;
}
}