Перейти к основному содержимому

Запросы без учета регистра с репозиторием данных Spring

· 2 мин. чтения

1. Обзор

Запросы Spring Data JPA по умолчанию чувствительны к регистру. Другими словами, при сравнении значений полей учитывается регистр.

В этом руководстве мы рассмотрим, как быстро создать запрос без учета регистра в репозитории Spring Data JPA.

2. Зависимости

Во-первых, давайте удостоверимся, что у нас есть зависимости базы данных Spring Data и H2 в нашем pom.xml :

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<version>2.6.1</version>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
<version>1.4.199</version>
</dependency>

Последние версии доступны на Maven Central.

3. Первоначальная настройка

Допустим, у нас есть сущность Passenger с атрибутами id, firstName и lastName :

@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
}

Кроме того, давайте подготовим наш тестовый класс, заполнив базу данных некоторыми образцами данных о пассажирах :

@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 для запросов без учета регистра

Теперь предположим, что мы хотим выполнить поиск без учета регистра, чтобы найти всех пассажиров с заданным именем firstName.

Для этого мы определим наш PassengerRepository как:

@Repository
public interface PassengerRepository extends JpaRepository<Passenger, Long> {
List<Passenger> 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<Passenger> 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)));
}

Несмотря на передачу «FrED» в качестве аргумента, наш возвращенный список пассажиров содержит Passenger с firstName как «Fred». Очевидно, что с помощью ключевого слова IgnoreCase мы добились совпадения без учета регистра.

5. Вывод

В этом кратком руководстве мы узнали, как создать запрос без учета регистра в репозитории Spring Data.

Наконец, примеры кода доступны на GitHub .