Skip to content

Commit

Permalink
Añadido metodo personalizado en Repository
Browse files Browse the repository at this point in the history
  • Loading branch information
Awes0meM4n committed Apr 28, 2020
1 parent d4141ff commit c2d5fd5
Show file tree
Hide file tree
Showing 4 changed files with 67 additions and 2 deletions.
Expand Up @@ -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();
}
Expand Down
11 changes: 11 additions & 0 deletions 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<T extends Evento> {

List<T> getEventosConParticipanteConTexto(String txt);

}
3 changes: 2 additions & 1 deletion src/main/java/es/lanyu/eventos/repositorios/PartidoDAO.java
Expand Up @@ -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<PartidoConId, Long> {
// Se construye por fragmentos de las distintas implementaciones: ver PartidoDAOImpl
public interface PartidoDAO extends JpaRepository<PartidoConId, Long>, EventoDAOCustom<PartidoConId> {

@RestResource(path="participante")
List<PartidoConId> findByIdLocalOrIdVisitante(@Param("idParticipante") String idLocal, @Param("idParticipante") String idVisitante);
Expand Down
52 changes: 52 additions & 0 deletions 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<PartidoConId> {

@Autowired
ParticipanteDAO participanteDAO;

@PersistenceContext
EntityManager entityManager;

@Override
public List<PartidoConId> getEventosConParticipanteConTexto(String txt) {
// Reutilizo los metodos que ya tengo disponibles
List<Participante> participantes = participanteDAO.findByNombreIgnoreCaseContaining(txt);
// Para que no se repitan partidos
Set<PartidoConId> partidos = new HashSet<PartidoConId>();
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<PartidoConId>(partidos);
}

}

0 comments on commit c2d5fd5

Please sign in to comment.