Автор оригинала: 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"); Listpassengers = 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 .