package org.transgalactica.management.data.people.dao.impl; import java.time.LocalDate; import java.util.ArrayList; import java.util.List; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Predicate; import javax.persistence.criteria.Root; import javax.persistence.criteria.SetJoin; import org.apache.commons.lang3.StringUtils; import org.transgalactica.management.data.materiel.bo.impl.JpaVaisseauEntity; import org.transgalactica.management.data.people.bo.BasicEmployeSummary; import org.transgalactica.management.data.people.bo.EmployeSearchCriteria; import org.transgalactica.management.data.people.bo.EmployeSummary; import org.transgalactica.management.data.people.bo.impl.AbstractJpaEmployeEntity; public class EmployeDaoImpl implements EmployeDaoCustom { @PersistenceContext private EntityManager em; protected EmployeDaoImpl() { } // TODO https://jira.spring.io/browse/DATAJPA-51 // TODO https://jira.spring.io/browse/DATACMNS-89 @Override public List<EmployeSummary> findEmployesByCriteria(EmployeSearchCriteria critereRechercheEmploye) { CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery<EmployeSummary> query = cb.createQuery(EmployeSummary.class); Root<AbstractJpaEmployeEntity> from = query.from(AbstractJpaEmployeEntity.class); List<Predicate> conditions = new ArrayList<>(); if (StringUtils.isNotBlank(critereRechercheEmploye.getNomEmploye())) { conditions.add(cb.like(cb.upper(from.<String> get("nom")), critereRechercheEmploye.getNomEmploye() .toUpperCase())); } if (critereRechercheEmploye.getDateEmbaucheEmployeDebut() != null) { conditions.add(cb.greaterThanOrEqualTo(from.<LocalDate> get("dateEmbauche"), critereRechercheEmploye.getDateEmbaucheEmployeDebut())); } if (critereRechercheEmploye.getDateEmbaucheEmployeFin() != null) { conditions.add(cb.lessThanOrEqualTo(from.<LocalDate> get("dateEmbauche"), critereRechercheEmploye.getDateEmbaucheEmployeFin())); } if (StringUtils.isNotBlank(critereRechercheEmploye.getImmatriculationVaisseau())) { SetJoin<AbstractJpaEmployeEntity, JpaVaisseauEntity> join = from.joinSet("vaisseaux"); conditions.add(cb.equal(join.get("immatriculation"), critereRechercheEmploye.getImmatriculationVaisseau())); } query.where(conditions.toArray(new Predicate[conditions.size()])); query.orderBy(cb.asc(from.get("nom"))); query.select(cb.construct(BasicEmployeSummary.class, from.get("matricule"), from.get("nom"), from.get("dateEmbauche"), from.get("type"))); return em.createQuery(query).getResultList(); } }