package com.megatim.fdxconsultation.dao.ifaces.abstracts; import com.megatim.fdxcommons.dao.ifaces.utils.SearchCriteriaBuilderUtil; import com.megatim.fdxcommons.model.search.SearchCriteria; import java.time.LocalDate; import java.util.ArrayList; import java.util.List; import javax.persistence.EntityManager; import javax.persistence.TypedQuery; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Predicate; import javax.persistence.criteria.Root; /** * * @author ASUS */ public interface PaginationWithSearchEnityDAO { public EntityManager getEntityManager(); public Class getManagedEntityClass(); public default long countBySearchEntity(U searchEntity) { CriteriaBuilder qb = getEntityManager().getCriteriaBuilder(); CriteriaQuery cq = qb.createQuery(Long.class); Root root = cq.from(getManagedEntityClass()); List searchCriterias = SearchCriteriaBuilderUtil.getSearchCriterias(searchEntity, getManagedEntityClass(), root, new ArrayList<>()); List predicates = createPedicates(searchCriterias, qb, root); cq.select(qb.count(root)); cq.where(predicates.toArray(new Predicate[predicates.size()])); return (long) getEntityManager().createQuery(cq).getSingleResult(); } public default List all() { CriteriaBuilder qb = getEntityManager().getCriteriaBuilder(); CriteriaQuery cq = qb.createQuery(getManagedEntityClass()); Root root = cq.from(getManagedEntityClass()); cq.select(root); return getEntityManager().createQuery(cq).getResultList(); } public default List findAllBySearchEntity(U searchEntity) { CriteriaBuilder qb = getEntityManager().getCriteriaBuilder(); CriteriaQuery cq = qb.createQuery(getManagedEntityClass()); Root root = cq.from(getManagedEntityClass()); List searchCriterias = SearchCriteriaBuilderUtil.getSearchCriterias(searchEntity, getManagedEntityClass(), root, new ArrayList<>()); List predicates = new ArrayList<>(); try { predicates = createPedicates(searchCriterias, qb, root); } catch (Exception e) { e.printStackTrace(); } cq.select(root); cq.where(predicates.toArray(new Predicate[predicates.size()])); return getEntityManager().createQuery(cq).getResultList(); } public default List findAllBySearchEntity(Integer pageNumber, Integer pagesize, U searchEntity) { CriteriaBuilder qb = getEntityManager().getCriteriaBuilder(); CriteriaQuery cq = qb.createQuery(getManagedEntityClass()); Root root = cq.from(getManagedEntityClass()); List searchCriterias = SearchCriteriaBuilderUtil.getSearchCriterias(searchEntity, getManagedEntityClass(), root, new ArrayList<>()); List predicates = new ArrayList<>(); try { predicates = createPedicates(searchCriterias, qb, root); } catch (Exception e) { e.printStackTrace(); } cq.select(root); cq.where(predicates.toArray(new Predicate[predicates.size()])); TypedQuery typedQuery = getEntityManager().createQuery(cq); typedQuery.setFirstResult((pageNumber - 1) * pagesize); typedQuery.setMaxResults(pagesize); return typedQuery.getResultList(); } /** * Méthode qui les prédicats à partir des critères de recherche * * @param searchCriterias * @param cb * @param root * @return */ default List createPedicates(List searchCriterias, CriteriaBuilder cb, Root root) { List predicates = new ArrayList<>(); searchCriterias.parallelStream().forEach(s -> { if (s.getFieldValue() != null) { Predicate predicate = null; switch (s.getOperateur()) { case EQUALS: predicate = cb.equal(s.getFrom().get(s.getFieldName()), s.getFieldValue()); predicates.add(predicate); break; case NOT_EQUALS: predicate = cb.notEqual(s.getFrom().get(s.getFieldName()), s.getFieldValue()); predicates.add(predicate); break; case LIKE: if (s.getFieldValue() instanceof String) { predicate = cb.like(s.getFrom().get(s.getFieldName()), "%" + s.getFieldValue().toString() + "%"); predicates.add(predicate); } break; case GREATER_THAN: if (s.getFieldValue() instanceof Number) { predicate = cb.gt(s.getFrom().get(s.getFieldName()), (Number) s.getFieldValue()); predicates.add(predicate); } else if (s.getFieldValue() instanceof String) { predicate = cb.greaterThanOrEqualTo(root.get(s.getFieldName()), s.getFieldValue().toString()); predicates.add(predicate); } else if (s.getFieldValue() instanceof LocalDate) { predicate = cb.greaterThan(s.getFrom().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 String) { predicate = cb.greaterThanOrEqualTo(root.get(s.getFieldName()), s.getFieldValue().toString()); 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(s.getFrom().get(s.getFieldName()), (Number) s.getFieldValue()); predicates.add(predicate); } else if (s.getFieldValue() instanceof String) { predicate = cb.greaterThanOrEqualTo(root.get(s.getFieldName()), s.getFieldValue().toString()); predicates.add(predicate); } else if (s.getFieldValue() instanceof LocalDate) { predicate = cb.lessThan(s.getFrom().get(s.getFieldName()), (LocalDate) s.getFieldValue()); predicates.add(predicate); } break; case LESS_OR_EQUALS_THAN: if (s.getFieldValue() instanceof Number) { predicate = cb.le(s.getFrom().get(s.getFieldName()), (Number) s.getFieldValue()); predicates.add(predicate); } else if (s.getFieldValue() instanceof String) { predicate = cb.greaterThanOrEqualTo(root.get(s.getFieldName()), s.getFieldValue().toString()); predicates.add(predicate); } else if (s.getFieldValue() instanceof LocalDate) { predicate = cb.lessThanOrEqualTo(s.getFrom().get(s.getFieldName()), (LocalDate) s.getFieldValue()); predicates.add(predicate); } break; case IN: if (s.getFieldValue() instanceof java.util.Collection) { predicate = s.getFrom().get(s.getFieldName()).in(s.getFieldValue()); predicates.add(predicate); } break; default: } } }); return predicates; } }