From c2d5fd5ed3c7609dcf4ace808781aff9c31bf099 Mon Sep 17 00:00:00 2001 From: Awes0meM4n Date: Tue, 28 Apr 2020 09:20:41 +0100 Subject: [PATCH] =?UTF-8?q?A=C3=B1adido=20metodo=20personalizado=20en=20Re?= =?UTF-8?q?pository?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DatosdeportivosapiApplication.java | 3 +- .../eventos/repositorios/EventoDAOCustom.java | 11 ++++ .../eventos/repositorios/PartidoDAO.java | 3 +- .../eventos/repositorios/PartidoDAOImpl.java | 52 +++++++++++++++++++ 4 files changed, 67 insertions(+), 2 deletions(-) create mode 100644 src/main/java/es/lanyu/eventos/repositorios/EventoDAOCustom.java create mode 100644 src/main/java/es/lanyu/eventos/repositorios/PartidoDAOImpl.java diff --git a/src/main/java/es/lanyu/datosdeportivosapi/DatosdeportivosapiApplication.java b/src/main/java/es/lanyu/datosdeportivosapi/DatosdeportivosapiApplication.java index 8a8eb40..bbf282f 100644 --- a/src/main/java/es/lanyu/datosdeportivosapi/DatosdeportivosapiApplication.java +++ b/src/main/java/es/lanyu/datosdeportivosapi/DatosdeportivosapiApplication.java @@ -45,8 +45,9 @@ public static void main(String[] args) { // Listo los partidos en consola PartidoDAO partidoDAO = context.getBean(PartidoDAO.class); - partidoDAO.findAll().stream().map(PartidoConId::toString).forEach(log::trace); +// partidoDAO.findAll().stream().map(PartidoConId::toString).forEach(log::trace); + partidoDAO.getEventosConParticipanteConTexto("m").stream().map(PartidoConId::toString).forEach(log::trace); // Ya no cierro la aplicacion // context.close(); } diff --git a/src/main/java/es/lanyu/eventos/repositorios/EventoDAOCustom.java b/src/main/java/es/lanyu/eventos/repositorios/EventoDAOCustom.java new file mode 100644 index 0000000..bedaf1e --- /dev/null +++ b/src/main/java/es/lanyu/eventos/repositorios/EventoDAOCustom.java @@ -0,0 +1,11 @@ +package es.lanyu.eventos.repositorios; + +import java.util.List; + +import es.lanyu.comun.evento.Evento; + +public interface EventoDAOCustom { + + List getEventosConParticipanteConTexto(String txt); + +} \ No newline at end of file diff --git a/src/main/java/es/lanyu/eventos/repositorios/PartidoDAO.java b/src/main/java/es/lanyu/eventos/repositorios/PartidoDAO.java index aa7d828..5efa45b 100644 --- a/src/main/java/es/lanyu/eventos/repositorios/PartidoDAO.java +++ b/src/main/java/es/lanyu/eventos/repositorios/PartidoDAO.java @@ -12,7 +12,8 @@ @RepositoryRestResource(path="partidos", // indica la parte de la URL para este recurso itemResourceRel="partido", // nombre cuando se hace referencia a un partido collectionResourceRel="partidos") // nombre cuando se hace referencia a varios partidos -public interface PartidoDAO extends JpaRepository { +// Se construye por fragmentos de las distintas implementaciones: ver PartidoDAOImpl +public interface PartidoDAO extends JpaRepository, EventoDAOCustom { @RestResource(path="participante") List findByIdLocalOrIdVisitante(@Param("idParticipante") String idLocal, @Param("idParticipante") String idVisitante); diff --git a/src/main/java/es/lanyu/eventos/repositorios/PartidoDAOImpl.java b/src/main/java/es/lanyu/eventos/repositorios/PartidoDAOImpl.java new file mode 100644 index 0000000..c235c56 --- /dev/null +++ b/src/main/java/es/lanyu/eventos/repositorios/PartidoDAOImpl.java @@ -0,0 +1,52 @@ +package es.lanyu.eventos.repositorios; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import javax.persistence.Query; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.annotation.Transactional; + +import es.lanyu.participante.Participante; +import es.lanyu.participante.repositorios.ParticipanteDAO; + +// Ver: https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#transactions +@Transactional(readOnly = true) +// Siguiendo la documentacion: +// https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.custom-implementations +// Se pueden implementar parcialmente metodos personalizados que incluso pueden ser reutilizados ya +// que usamos EventoDAOCustom y puede servir para otros tipos de eventos aparte de Partido +// Pero esto no expone los metodos, simplemente proporciona la implementacion de los metodos +// que no puede hacer automaticamente JPA. Es importante usar el sufijo "Impl" (o configurar otro) +class PartidoDAOImpl implements EventoDAOCustom { + + @Autowired + ParticipanteDAO participanteDAO; + + @PersistenceContext + EntityManager entityManager; + + @Override + public List getEventosConParticipanteConTexto(String txt) { + // Reutilizo los metodos que ya tengo disponibles + List participantes = participanteDAO.findByNombreIgnoreCaseContaining(txt); + // Para que no se repitan partidos + Set partidos = new HashSet(); + Query query = entityManager.createNativeQuery( + "SELECT p.* FROM partidos as p " + + "WHERE p.local = ?1 OR p.visitante = ?1", PartidoConId.class); + participantes.forEach(p -> { + // Solo cambia el parametro para cada participante + query.setParameter(1, p.getIdentificador()); + partidos.addAll(query.getResultList()); + }); + + return new ArrayList(partidos); + } + +}