Spring

Spring Data JPA LIKE Query 예제

기록만이살길 2020. 6. 30. 02:33
반응형

Spring Data JPA LIKE Query 예제

1. 소개

이 빠른 자습서에서는 Spring JPA 저장소 에서 LIKE 쿼리를 작성하는 다양한 방법을 다룰 것 입니다.

쿼리 방법을 만드는 동안 사용할 수있는 다양한 키워드를 살펴 보는 것부터 시작하겠습니다. 그런 다음 @Query 어노테이션을 명명 된 순서화 된 매개 변수로 다룰 것 입니다.

2. 기본 세팅

이 예에서는 영화 테이블을 쿼리 합니다.

Movie 엔터티를 정의 해 봅시다 :

@Entity
public class Movie {
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    private Long id;
    private String title;
    private String director;
    private String rating;
    private int duration;

    // standard getters and setters
}

우리와 함께 영화의 실체는 정의의 명령문 삽입 몇 가지 예제를 만들어 보자 :

INSERT INTO movie(id, title, director, rating, duration) 
    VALUES(1, 'Godzilla: King of the Monsters', ' Michael Dougherty', 'PG-13', 132);
INSERT INTO movie(id, title, director, rating, duration) 
    VALUES(2, 'Avengers: Endgame', 'Anthony Russo', 'PG-13', 181);
INSERT INTO movie(id, title, director, rating, duration) 
    VALUES(3, 'Captain Marvel', 'Anna Boden', 'PG-13', 123);
INSERT INTO movie(id, title, director, rating, duration) 
    VALUES(4, 'Dumbo', 'Tim Burton', 'PG', 112);
INSERT INTO movie(id, title, director, rating, duration) 
    VALUES(5, 'Booksmart', 'Olivia Wilde', 'R', 102);
INSERT INTO movie(id, title, director, rating, duration) 
    VALUES(6, 'Aladdin', 'Guy Ritchie', 'PG', 128);
INSERT INTO movie(id, title, director, rating, duration) 
    VALUES(7, 'The Sun Is Also a Star', 'Ry Russo-Young', 'PG-13', 100);

3. Like 쿼리 예제

많은 간단한 LIKE 쿼리 시나리오의 경우 다양한 키워드를 활용하여 리포지토리에서 쿼리 메서드를 만들 수 있습니다.

지금 살펴 보도록하겠습니다.

3.1. Containing , Contains , IsContaining 및 Like

쿼리 방법으로 다음과 같은 LIKE 쿼리를 수행하는 방법을 살펴 보겠습니다.

SELECT * FROM movie WHERE title LIKE '%in%';

먼저 Containing , ContainsIsContaining을 사용하여 쿼리 메서드를 정의 해 보겠습니다 .

List<Movie> findByTitleContaining(String title);
List<Movie> findByTitleContains(String title);
List<Movie> findByTitleIsContaining(String title);

다음과 같이 부분 제목 으로 쿼리 메소드를 호출 해 보겠습니다 .

List<Movie> results = movieRepository.findByTitleContaining("in");
assertEquals(3, results.size());

results = movieRepository.findByTitleIsContaining("in");
assertEquals(3, results.size());

results = movieRepository.findByTitleContains("in");
assertEquals(3, results.size());

세 가지 방법 모두 동일한 결과를 반환 할 것으로 예상 할 수 있습니다.

Spring은 또한 Like 키워드를 제공하지만 와일드 카드 문자에 검색 매개 변수를 제공해야한다는 점에서 약간 다르게 작동합니다.

LIKE 쿼리 메소드를 정의 해 봅시다 :

List<Movie> findByTitleLike(String title);

이제 와일드 카드 문자를 포함하여 이전에 사용한 것과 동일한 값으로 findByTitleLike 메소드를 호출 해 보겠습니다 .

results = movieRepository.findByTitleLike("%in%");
assertEquals(3, results.size());

3.2. StartsWith 예제

이제 다음 쿼리를 살펴 보겠습니다.

SELECT * FROM Movie WHERE Rating LIKE 'PG%';

StartsWith 키워드를 사용하여 쿼리 메소드를 만들어 봅시다 :

List<Movie> findByRatingStartsWith(String rating);

메소드가 정의 된 상태에서 PG 값으로 호출 해 봅시다 .

List<Movie> results = movieRepository.findByRatingStartsWith("PG");
assertEquals(6, results.size());

3.3. EndsWith 예제

Spring은 EndsWith 키워드 와 반대되는 기능을 제공 합니다.

이 쿼리를 고려해 봅시다 :

SELECT * FROM Movie WHERE director LIKE '%Burton';

이제 EndsWith 쿼리 메소드를 정의 해 봅시다 :

List<Movie> findByDirectorEndsWith(String director);

메소드를 정의했으면 Burton 매개 변수를 사용하여 호출 해 봅시다 :

List<Movie> results = movieRepository.findByDirectorEndsWith("Burton");
assertEquals(1, results.size());

3.4. 대소 문자 구분 예제

우리는 경우에 상관없이 특정 문자열을 포함하는 모든 레코드를 찾으려고합니다. SQL에서는 열을 모든 대문자 또는 소문자로 강제하고 쿼리하는 값과 동일하게 제공하여이를 수행 할 수 있습니다.

Spring JPA를 사용하면 IgnoreCase 키워드를 다른 키워드 중 하나와 결합하여 사용할 수 있습니다 .

List<Movie> findByTitleContainingIgnoreCase(String title);

이제 우리는 함께 메서드를 호출 할 수 있습니다 과 결과는 모두 낮은 - 대문자 결과를 포함 얻을 것으로 예상 :

List<Movie> results = movieRepository.findByTitleContainingIgnoreCase("the");
assertEquals(2, results.size());

3.5. Not 예제

때로는 특정 문자열을 포함하지 않는 모든 레코드를 찾으려고합니다. 우리는 사용할 수 NotContains , NotContaining을, 그리고 NOTLIKE 키워드 그렇게 할 수 있습니다.

PG가 포함되지 않은 등급의 영화를 찾기 위해 NotContaining 을 사용하여 쿼리를 정의 해 보겠습니다 .

List<Movie> findByRatingNotContaining(String rating);

이제 새로 정의 된 메소드를 호출 해 봅시다 :

List<Movie> results = movieRepository.findByRatingNotContaining("PG");
assertEquals(1, results.size());

director가 특정 문자열로 시작하지 않는 레코드를 찾는 기능을 달성하려면 NotLike 키워드를 사용하여 와일드 카드 배치를 제어하십시오.

List<Movie> findByDirectorNotLike(String director);

마지막으로이 메서드를 호출하여 감독의 이름이 An 이외 것으로 시작하는 모든 영화를 찾습니다 .

List<Movie> results = movieRepository.findByDirectorNotLike("An%");
assertEquals(5, results.size());

비슷한 방식으로 NotLike 를 사용 하여 EndsWith 종류의 기능 과 Not을 결합 할 수 있습니다 .

4. @Query 예제

때때로 우리는 Query Methods에 대해 너무 복잡한 쿼리를 만들어야하거나 너무 긴 메소드 이름을 초래할 수 있습니다. 이 경우 [@Query 주석](https://www.baeldung.com/spring-data-jpa-query) 을 사용하여 데이터베이스를 쿼리 할 수 ​​있습니다.

4.1. 명시적인 매개 변수

비교를 위해 앞에서 정의한 findByTitleContaining 메소드 와 동등한 조회를 작성하십시오 .

@Query("SELECT m FROM Movie m WHERE m.title LIKE %:title%")
List<Movie> searchByTitleLike(@Param("title") String title);

제공하는 쿼리에 와일드 카드를 포함시킵니다. 파라미터 : 우리가 명명 된 매개 변수를 사용하고 있기 때문에 주석은 여기에 중요하다.

4.2. 순서로 넘겨지는 매개 변수

명명 된 매개 변수 외에도 쿼리에서 정렬 된 매개 변수를 사용할 수 있습니다.

@Query("SELECT m FROM Movie m WHERE m.rating LIKE ?1%")
List<Movie> searchByRatingStartsWith(String rating);

와일드 카드를 제어 할 수 있으므로이 쿼리 는 findByRatingStartsWith 쿼리 메소드 와 동일합니다 .

PG로 시작하는 등급의 모든 영화를 찾으십시오 .

List<Movie> results = movieRepository.searchByRatingStartsWith("PG");
assertEquals(6, results.size());

신뢰할 수없는 데이터가있는 LIKE 쿼리에서 순서 매개 변수를 사용하는 경우 들어오는 검색 값을 이스케이프해야합니다.

Spring Boot 2.4.1 이상을 사용하는 경우 SpEL 이스케이프 방법을 사용할 수 있습니다 .

@Query("SELECT m FROM Movie m WHERE m.director LIKE %?#{escape([0])} escape ?#{escapeCharacter()}")
List<Movie> searchByDirectorEndsWith(String director);

이제 Burton 값으로 메소드를 호출 해 봅시다 :

List<Movie> results = movieRepository.searchByDirectorEndsWith("Burton");
assertEquals(1, results.size());

5. 결론

이 짧은 튜토리얼에서는 Spring JPA 저장소에서 LIKE 쿼리를 작성하는 방법을 배웠다.

먼저 제공된 키워드를 사용하여 쿼리 방법을 만드는 방법을 배웠습니다. 그런 다음 @Query 매개 변수와 명명 된 매개 변수 및 정렬 된 매개 변수를 사용하여 동일한 작업을 수행하는 방법을 배웠습니다 .

전체 예제 코드는 GitHub에서 사용할 수 있습니다 .

참고

https://www.baeldung.com/spring-jpa-like-queries

반응형