75 lines
2.5 KiB
Java
75 lines
2.5 KiB
Java
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<Article, Long> {
|
|
|
|
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<Article> findByCriteria(String keyword, Long authorId, int page, int size) {
|
|
try (Session session = sessionFactory.openSession()) {
|
|
|
|
CriteriaBuilder cb = session.getCriteriaBuilder();
|
|
CriteriaQuery<Article> query = cb.createQuery(Article.class);
|
|
|
|
Root<Article> root = query.from(Article.class);
|
|
query.select(root);
|
|
|
|
List<Predicate> 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();
|
|
}
|
|
}
|
|
}
|