/* * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template */ package com.megatim.fdxconvert.dao; import com.megatimfx.common.pojo.SearchCriteria; import com.megatim.fdxconvert.service.pojo.PaginationElts; import java.lang.reflect.Field; import java.time.LocalDate; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.persistence.TypedQuery; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Predicate; import javax.persistence.criteria.Root; import lombok.Getter; import lombok.Setter; import org.hibernate.Session; /** * * @author mela */ @Getter @Setter public class AbstractDAO { private Class clazz; private PaginationElts pagination; public AbstractDAO(Class clas) { clazz = clas; pagination = new PaginationElts(); } public T add(T element) { try ( Session session = HibernateUtil.getSessionFactory().openSession()) { session.beginTransaction(); session.persist(element); session.getTransaction().commit(); session.refresh(element); return element; } } public T edit(T element) { try ( Session session = HibernateUtil.getSessionFactory().openSession()) { session.beginTransaction(); session.update(element); session.getTransaction().commit(); session.refresh(element); return element; } } public void delete(T element) { try ( Session session = HibernateUtil.getSessionFactory().openSession()) { session.beginTransaction(); session.delete(element); session.getTransaction().commit(); } } public void deleteAll(String tableName) { List liste = getAll(tableName); try ( Session session = HibernateUtil.getSessionFactory().openSession()) { session.beginTransaction(); liste.forEach(t -> session.delete(t)); session.getTransaction().commit(); } } public T find(Object element) { try ( Session session = HibernateUtil.getSessionFactory().openSession()) { return session.find(clazz, element); } } public List getAll(String tableName) { try ( Session session = HibernateUtil.getSessionFactory().openSession()) { List liste = session.createQuery("from " + tableName).getResultList(); return liste; } } public List getAllByPage(int indexDebut, int numberOfElt, List searchCriterias) { try ( Session session = HibernateUtil.getSessionFactory().openSession()) { CriteriaBuilder criteriaBuilder = session.getCriteriaBuilder(); CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(clazz); Root root = criteriaQuery.from(clazz); List predicates = createPedicates(searchCriterias, criteriaBuilder, root); CriteriaQuery cq = criteriaQuery.select(root); cq = cq.select(root).where(predicates.toArray(new Predicate[predicates.size()])); TypedQuery typedQuery = session.createQuery(cq); typedQuery.setFirstResult(indexDebut); typedQuery.setMaxResults(numberOfElt); List liste = typedQuery.getResultList(); return liste; } } private long count(List searchCriterias) { try ( Session session = HibernateUtil.getSessionFactory().openSession()) { CriteriaBuilder qb = session.getCriteriaBuilder(); CriteriaQuery cq = qb.createQuery(Long.class); Root root = cq.from(clazz); List predicates = createPedicates(searchCriterias, qb, root); cq.select(qb.count(root)); cq.where(predicates.toArray(new Predicate[predicates.size()])); return (long) session.createQuery(cq).getSingleResult(); } } public PaginationElts initPaginationElts(int pageNumber, List searchCriterias) { int indexDebut = pageNumber * pagination.getNbEltsPerPage(); pagination.setListe(getAllByPage(indexDebut, pagination.getNbEltsPerPage(), searchCriterias)); pagination.setTotalElts(count(searchCriterias)); pagination.setPage(pageNumber); if (pageNumber == 0) { pagination.setNumberOfElts(pagination.getListe().size()); } else { pagination.setNumberOfElts(pageNumber * pagination.getNbEltsPerPage() + pagination.getListe().size()); } pagination.setNumberOfPage((pagination.getTotalElts() % pagination.getNbEltsPerPage() == 0) ? (pagination.getTotalElts() / pagination.getNbEltsPerPage()) : (pagination.getTotalElts() / pagination.getNbEltsPerPage()) + 1); return pagination; } /** * Méthode qui retounre la liste des champs de la classe clazz * * @return */ private Map getClassFields() { Field[] fields = clazz.getDeclaredFields(); Map mapOfFields = new HashMap<>(); for (Field field : fields) { mapOfFields.put(field.getName(), field); } return mapOfFields; } /** * Méthode qui vérifie que le champ "fieldValue" de l'objet searchCriteria * est du même type que le champ "fieldName" dans la classe clazz * * @param field : contient les informations sur le champ correspondant * @param value : valeur dont on veut vérifier le type * @return : retourne vrai sivalue est du même type que celui renseigné dans * field */ private boolean isFieldAndValueOfSameType(Field field, Object value) { boolean result = true; try { field.getType().cast(value); } catch (ClassCastException ex) { result = false; } return result; //String className = field.getType().getName(); } /** * Méthode qui filtre la liste des critères afin de ne garder que ceux qui * respectent le type du champ correspondant dans la classe et ceux dont le * fieldName correspond à un champ de la classe clazz * * @param searchCriterias * @return */ private List verifySearchCriteria(List searchCriterias) { Map mapOfFields = getClassFields(); //Retire les critères dont le fieldName ne correspond à aucun champ de la classe clazz for (SearchCriteria criteria : searchCriterias) { if (!mapOfFields.containsKey(criteria.getFieldName())) { searchCriterias.remove(criteria); // continue; } // Retire les critères dont le type de fieldValue ne correspond pas au type du champ dans la classe clazz // if(!isFieldAndValueOfSameType(mapOfFields.get(criteria.getFieldName()),criteria.getFieldValue())){ // searchCriterias.remove(criteria); // } } return searchCriterias; } /** * Méthode qui les prédicats à partir des critères de recherche * * @param searchCriterias * @param cb * @return */ private List createPedicates(List searchCriterias, CriteriaBuilder cb, Root root) { List predicates = new ArrayList<>(); searchCriterias = verifySearchCriteria(searchCriterias); searchCriterias.parallelStream().forEach(s -> { Predicate predicate = null; switch (s.getOperateur()) { case EQUALS: predicate = cb.equal(root.get(s.getFieldName()), s.getFieldValue()); predicates.add(predicate); break; case NOT_EQUALS: predicate = cb.notEqual(root.get(s.getFieldName()), s.getFieldValue()); predicates.add(predicate); break; case LIKE: if (s.getFieldValue() instanceof String) { predicate = cb.like(root.get(s.getFieldName()), "%" + s.getFieldValue().toString() + "%"); predicates.add(predicate); } break; case GREATER_THAN: if (s.getFieldValue() instanceof Number) { predicate = cb.gt(root.get(s.getFieldName()), (Number) s.getFieldValue()); predicates.add(predicate); } else if (s.getFieldValue() instanceof LocalDate) { predicate = cb.greaterThan(root.get(s.getFieldName()), (LocalDate) s.getFieldValue()); predicates.add(predicate); } break; case GREATER_OR_EQUALS_THAN: if (s.getFieldValue() instanceof Number) { predicate = cb.ge(root.get(s.getFieldName()), (Number) s.getFieldValue()); predicates.add(predicate); } else if (s.getFieldValue() instanceof LocalDate) { predicate = cb.greaterThanOrEqualTo(root.get(s.getFieldName()), (LocalDate) s.getFieldValue()); predicates.add(predicate); } break; case LESS_THAN: if (s.getFieldValue() instanceof Number) { predicate = cb.lt(root.get(s.getFieldName()), (Number) s.getFieldValue()); predicates.add(predicate); } else if (s.getFieldValue() instanceof LocalDate) { predicate = cb.lessThan(root.get(s.getFieldName()), (LocalDate)s.getFieldValue()); predicates.add(predicate); } break; case _LESS_OR_EQUALS_THAN: if (s.getFieldValue() instanceof Number) { predicate = cb.le(root.get(s.getFieldName()), (Number) s.getFieldValue()); predicates.add(predicate); } else if (s.getFieldValue() instanceof LocalDate) { predicate = cb.lessThanOrEqualTo(root.get(s.getFieldName()), (LocalDate)s.getFieldValue()); predicates.add(predicate); } break; case IN: if (s.getFieldValue() instanceof java.util.Collection) { predicate = root.get(s.getFieldName()).in(s.getFieldValue()); predicates.add(predicate); } break; default: } }); return predicates; } }