diff --git a/src/main/java/org/springframework/samples/petclinic/repository/jdbc/JdbcPetTypeRepositoryImpl.java b/src/main/java/org/springframework/samples/petclinic/repository/jdbc/JdbcPetTypeRepositoryImpl.java index ee958432cabbeeb74cae919b0a2e0e4e6acefecf..1835cb71f36b67b84dfb86fbc11a76062d7ebbd1 100644 --- a/src/main/java/org/springframework/samples/petclinic/repository/jdbc/JdbcPetTypeRepositoryImpl.java +++ b/src/main/java/org/springframework/samples/petclinic/repository/jdbc/JdbcPetTypeRepositoryImpl.java @@ -47,11 +47,11 @@ import org.springframework.stereotype.Repository; @Repository @Profile("jdbc") public class JdbcPetTypeRepositoryImpl implements PetTypeRepository { - + private NamedParameterJdbcTemplate namedParameterJdbcTemplate; - + private SimpleJdbcInsert insertPetType; - + @Autowired public JdbcPetTypeRepositoryImpl(DataSource dataSource) { this.namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(dataSource); @@ -76,7 +76,23 @@ public class JdbcPetTypeRepositoryImpl implements PetTypeRepository { return petType; } - @Override + @Override + public PetType findByName(String name) throws DataAccessException { + PetType petType; + try { + Map<String, Object> params = new HashMap<>(); + params.put("name", name); + petType = this.namedParameterJdbcTemplate.queryForObject( + "SELECT id, name FROM types WHERE name= :name", + params, + BeanPropertyRowMapper.newInstance(PetType.class)); + } catch (EmptyResultDataAccessException ex) { + throw new ObjectRetrievalFailureException(PetType.class, name); + } + return petType; + } + + @Override public Collection<PetType> findAll() throws DataAccessException { Map<String, Object> params = new HashMap<>(); return this.namedParameterJdbcTemplate.query( diff --git a/src/main/java/org/springframework/samples/petclinic/repository/jdbc/JdbcSpecialtyRepositoryImpl.java b/src/main/java/org/springframework/samples/petclinic/repository/jdbc/JdbcSpecialtyRepositoryImpl.java index 5042cd0e7a7e5d7ba4dbcc54b446edba396afd48..256f34d1bd7f0bd4fd93830f5df83f7b87913599 100644 --- a/src/main/java/org/springframework/samples/petclinic/repository/jdbc/JdbcSpecialtyRepositoryImpl.java +++ b/src/main/java/org/springframework/samples/petclinic/repository/jdbc/JdbcSpecialtyRepositoryImpl.java @@ -16,12 +16,11 @@ package org.springframework.samples.petclinic.repository.jdbc; -import java.util.Collection; -import java.util.HashMap; -import java.util.Map; +import java.util.*; import javax.sql.DataSource; +import io.micrometer.core.instrument.binder.db.MetricsDSLContext; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Profile; import org.springframework.dao.DataAccessException; @@ -43,9 +42,9 @@ import org.springframework.stereotype.Repository; @Repository @Profile("jdbc") public class JdbcSpecialtyRepositoryImpl implements SpecialtyRepository { - + private NamedParameterJdbcTemplate namedParameterJdbcTemplate; - + private SimpleJdbcInsert insertSpecialty; @Autowired @@ -72,7 +71,25 @@ public class JdbcSpecialtyRepositoryImpl implements SpecialtyRepository { return specialty; } - @Override + @Override + public List<Specialty> findByNameIn(Set<String> names) { + List<Specialty> specialties; + try{ + String sql = "SELECT id, name FROM specialties WHERE specialties.name IN (:names)"; + Map<String, Object> params = new HashMap<>(); + params.put("names", names); + specialties = this.namedParameterJdbcTemplate.query( + sql, + params, + new BeanPropertyRowMapper<>(Specialty.class)); + } catch (EmptyResultDataAccessException ex){ + throw new ObjectRetrievalFailureException(Specialty.class, names); + } + + return specialties; + } + + @Override public Collection<Specialty> findAll() throws DataAccessException { Map<String, Object> params = new HashMap<>(); return this.namedParameterJdbcTemplate.query( diff --git a/src/test/java/org/springframework/samples/petclinic/service/clinicService/AbstractClinicServiceTests.java b/src/test/java/org/springframework/samples/petclinic/service/clinicService/AbstractClinicServiceTests.java index eb3d8ea7c4a3625518ece2b1d7e26509bc0ac9cb..cdc081d946ceccc123467ad14c7b7909adca94d0 100644 --- a/src/test/java/org/springframework/samples/petclinic/service/clinicService/AbstractClinicServiceTests.java +++ b/src/test/java/org/springframework/samples/petclinic/service/clinicService/AbstractClinicServiceTests.java @@ -25,6 +25,9 @@ import org.springframework.transaction.annotation.Transactional; import java.time.LocalDate; import java.util.Collection; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; import static org.assertj.core.api.Assertions.assertThat; @@ -470,5 +473,36 @@ abstract class AbstractClinicServiceTests { assertThat(specialty).isNull(); } - + @Test + @Transactional + void shouldFindSpecialtyByName() { + Specialty specialty1 = new Specialty(); + specialty1.setName("radiology"); + specialty1.setId(1); + Specialty specialty2 = new Specialty(); + specialty2.setName("surgery"); + specialty2.setId(2); + Specialty specialty3 = new Specialty(); + specialty3.setName("dentistry"); + specialty3.setId(3); + List<Specialty> expectedSpecialties = List.of(specialty1, specialty2, specialty3); + Set<String> specialtyNames = expectedSpecialties.stream() + .map(Specialty::getName) + .collect(Collectors.toSet()); + Collection<Specialty> actualSpecialties = this.clinicService.findSpecialtiesByName(specialtyNames); + assertThat(actualSpecialties).isNotNull(); + assertThat(actualSpecialties.size()).isEqualTo(expectedSpecialties.size()); + for (Specialty expected : expectedSpecialties) { + assertThat(actualSpecialties.stream() + .anyMatch( + actual -> actual.getName().equals(expected.getName()) + && actual.getId().equals(expected.getId()))).isTrue(); + } + } + + @Test + void shouldFindPetTypeByName(){ + PetType petType = this.clinicService.findPetTypeByName("cat"); + assertThat(petType.getId()).isEqualTo(1); + } }