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; public class ArticleDao extends GenericDaoImpl { public ArticleDao(SessionFactory sessionFactory) { super(sessionFactory, Article.class); } public Article findByAuthor(String author) { try (Session session = sessionFactory.openSession()) { session.beginTransaction(); Article article = session.createQuery("FROM Article WHERE author = :author", Article.class) .setParameter("author", author) .uniqueResult(); session.getTransaction().commit(); return article; } } public Article findByTitle(String title) { try (Session session = sessionFactory.openSession()) { session.beginTransaction(); Article article = session.createQuery("FROM Article WHERE title = :title", Article.class) .setParameter("title", title) .uniqueResult(); session.getTransaction().commit(); return article; } } public List
findByCriteria(String keyword, Long authorId, int page, int size) { try (Session session = sessionFactory.openSession()) { CriteriaBuilder cb = session.getCriteriaBuilder(); CriteriaQuery
query = cb.createQuery(Article.class); Root
root = query.from(Article.class); query.select(root); List predicates = new ArrayList<>(); 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(); } } }