package com.megatim.fdxconsultation.dao.ifaces.abstracts; import com.megatim.fdxcommons.model.pojo.CriteriaEntityFromView; import com.megatim.fdxcommons.tools.database.tables.dto.JpqlQueryElement; import com.megatim.fdxcommons.model.pojo.OrderByDefinition; import com.megatim.fdxcommons.tools.database.queries.metadata.jpql.JpqlQueryParam; import com.megatim.fdxcommons.tools.database.tables.JpqlTable; import java.util.List; import javax.persistence.EntityGraph; import javax.persistence.EntityManager; import javax.persistence.Query; /** * * @author ASUS */ public interface CustomDAOWithCriteriaEntityIfaces { default T save(T entity) { return getEntityManager().merge(entity); } default void delete(T entity) { getEntityManager().remove(entity); } public Class getManagedEntityClass(); public EntityManager getEntityManager(); public T getById(ID id); public default List findAll(CriteriaEntityFromView criterion, List fetchEagerFields, List orderByFields) throws Exception { EntityGraph entityGraph = getEntityManager().createEntityGraph(getManagedEntityClass()); fetchEagerFields.stream().forEach(f -> entityGraph.addAttributeNodes(f)); JpqlQueryElement jpqlQueryElt = new JpqlTable(criterion, getManagedEntityClass()).selectQuery(orderByFields); System.out.println("****************** query " + jpqlQueryElt.getQuery()); Query query = getEntityManager().createQuery(jpqlQueryElt.getQuery()); setRealParams(query, jpqlQueryElt.getParameters()); query.setHint("javax.persistence.loadgraph", entityGraph); return query.getResultList(); } public default long count(CriteriaEntityFromView criterion) throws Exception { JpqlQueryElement jpqlQueryElt = new JpqlTable(criterion, getManagedEntityClass()).countQuery(); Query query = getEntityManager().createQuery(jpqlQueryElt.getQuery()); System.out.println("****************** query " + jpqlQueryElt.getQuery()); setRealParams(query, jpqlQueryElt.getParameters()); return (long) query.getSingleResult(); } public default List findWithPagination(CriteriaEntityFromView criterion, List fetchEagerFields, List orderByFields, Integer pageNumber, Integer pageSize) throws Exception { EntityGraph entityGraph = getEntityManager().createEntityGraph(getManagedEntityClass()); fetchEagerFields.stream().forEach(f -> entityGraph.addAttributeNodes(f)); JpqlQueryElement jpqlQueryElt = new JpqlTable(criterion, getManagedEntityClass()).selectQuery(orderByFields); System.out.println("****************** query " + jpqlQueryElt.getQuery()); Query query = getEntityManager().createQuery(jpqlQueryElt.getQuery()); setRealParams(query, jpqlQueryElt.getParameters()); query.setHint("javax.persistence.loadgraph", entityGraph); query.setFirstResult((pageNumber - 1) * pageSize); query.setMaxResults(pageSize); return query.getResultList(); } public default void setRealParams(Query query, List params) { int index = 1; for (JpqlQueryParam p : params) { query.setParameter(index, p.getParamValue()); index++; } } }