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);
+    }
 }