Автор оригинала: Shubhra Srivastava.
1. Обзор
Запросы Spring Data JPA по умолчанию чувствительны к регистру. Другими словами, сравнение значений полей чувствительно к регистру.
В этом руководстве мы рассмотрим, как быстро создать запрос без учета регистра в репозитории Spring Data JPA.
2. Зависимости
Во-первых, давайте убедимся, что у нас есть Spring Data и H2 зависимости от базы данных в вашем pom.xml :
org.springframework.boot spring-boot-starter-data-jpa 2.4.0 com.h2database h2 runtime 1.4.199
Последние версии этих программ доступны на Maven Central.
3. Начальная настройка
Допустим, у нас есть Passenger сущность с id , именем и фамилией атрибутами:
@Entity
class Passenger {
@Id
@GeneratedValue
@Column(nullable = false)
private Long id;
@Basic(optional = false)
@Column(nullable = false)
private String firstName;
@Basic(optional = false)
@Column(nullable = false)
private String lastName;
// constructor, static factory, getters, setters
}Кроме того, давайте подготовим наш тестовый класс, заполнив базу данных некоторыми образцами данных Passenger :
@DataJpaTest
@RunWith(SpringRunner.class)
public class PassengerRepositoryIntegrationTest {
@PersistenceContext
private EntityManager entityManager;
@Autowired
private PassengerRepository repository;
@Before
public void before() {
entityManager.persist(Passenger.from("Jill", "Smith"));
entityManager.persist(Passenger.from("Eve", "Jackson"));
entityManager.persist(Passenger.from("Fred", "Bloggs"));
entityManager.persist(Passenger.from("Ricki", "Bobbie"));
entityManager.persist(Passenger.from("Siya", "Kolisi"));
}
//...
}4. IgnoreCase для запросов без учета регистра
Теперь предположим, что мы хотим выполнить поиск без учета регистра, чтобы найти всех пассажиров с заданным именем.
Для этого мы определим наш Пассажирский репозиторий как:
@Repository public interface PassengerRepository extends JpaRepository{ List findByFirstNameIgnoreCase(String firstName); }
Здесь ключевое слово | IgnoreCase гарантирует, что совпадения запроса не зависят от регистра.
Мы также можем проверить это с помощью теста JUnit:
@Test
public void givenPassengers_whenMatchingIgnoreCase_thenExpectedReturned() {
Passenger jill = Passenger.from("Jill", "Smith");
Passenger eve = Passenger.from("Eve", "Jackson");
Passenger fred = Passenger.from("Fred", "Bloggs");
Passenger siya = Passenger.from("Siya", "Kolisi");
Passenger ricki = Passenger.from("Ricki", "Bobbie");
List passengers = repository.findByFirstNameIgnoreCase("FrED");
assertThat(passengers, contains(fred));
assertThat(passengers, not(contains(eve)));
assertThat(passengers, not(contains(siya)));
assertThat(passengers, not(contains(jill)));
assertThat(passengers, not(contains(ricki)));
} Несмотря на то, что в качестве аргумента был передан “Фред” , наш возвращенный список пассажиров содержит Пассажира с именем как “Фред”. Очевидно, что с помощью ключевого слова IgnoreCase мы добились соответствия без учета регистра.
5. Заключение
В этом кратком руководстве мы узнали, как создать запрос без учета регистра в хранилище данных Spring.
Наконец, примеры кода доступны на GitHub .