package com.titanic.ventapasajes.repositorio; import java.io.Serializable; import java.util.List; import javax.inject.Inject; import javax.persistence.EntityManager; import javax.persistence.NoResultException; import javax.persistence.PersistenceException; import org.apache.commons.lang3.StringUtils; import org.hibernate.Criteria; import org.hibernate.Session; import org.hibernate.criterion.MatchMode; import org.hibernate.criterion.Order; import org.hibernate.criterion.Restrictions; import com.titanic.ventapasajes.modelo.Cliente; import com.titanic.ventapasajes.repositorio.filtros.ClienteFiltros; import com.titanic.ventapasajes.service.NegocioExcepciones; import com.titanic.ventapasajes.util.jpa.Transaccion; public class ClienteRepositorio implements Serializable{ private static final long serialVersionUID = 1L; @Inject private EntityManager entityManager; public Cliente buscarClienteporId(Long ideCliente) { return this.entityManager.find(Cliente.class, ideCliente); } public List<Cliente> buscarTodos(){ return this.entityManager.createQuery("from Cliente").getResultList(); } public List<Cliente> buscarClientePorNombre(String nombreCliente) { return this.entityManager.createQuery("from Cliente " + "where upper(nombreCliente) like :nombreCliente", Cliente.class) .setParameter("nombreCliente", nombreCliente.toUpperCase() + "%") .getResultList(); } @SuppressWarnings("unchecked") public List<Cliente> listarClientesFiltrados(ClienteFiltros clienteFiltros) { Session session = entityManager.unwrap(Session.class); Criteria criteria = session.createCriteria(Cliente.class); if(StringUtils.isNotBlank(clienteFiltros.getNumeroDocumento())){ criteria.add(Restrictions.eq("numeroDocumento", clienteFiltros.getNumeroDocumento())); } if(StringUtils.isNotBlank(clienteFiltros.getEmail())){ criteria.add(Restrictions.eq("email", clienteFiltros.getEmail())); } if(StringUtils.isNotBlank(clienteFiltros.getNombre())){ criteria.add(Restrictions.ilike("nombreCliente", clienteFiltros.getNombre(), MatchMode.ANYWHERE)); } return criteria.addOrder(Order.asc("nombreCliente")).list(); } @Transaccion public void removerCliente(Cliente cliente) { try{ cliente = obtenerCliente(cliente.getIdeCliente()); entityManager.remove(cliente); entityManager.flush(); }catch(PersistenceException e){ throw new NegocioExcepciones("El cliente no puede ser eliminado."); } } public Cliente obtenerCliente(Long id){ return entityManager.find(Cliente.class, id); } public Cliente obtenerClientePorNumeroDocumento(String numeroDocumento){ try{ return entityManager.createQuery("from Cliente where numeroDocumento = :numeroDocumento", Cliente.class) .setParameter("numeroDocumento", numeroDocumento) .getSingleResult(); }catch(NoResultException e){ return null; } } @Transaccion public Cliente adicionarCliente(Cliente cliente) { return entityManager.merge(cliente); } }