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 , Contains 및 IsContaining을 사용하여 쿼리 메서드를 정의 해 보겠습니다 .
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에서 사용할 수 있습니다 .
참고
'Spring' 카테고리의 다른 글
스프링 Security Form 로그인 사용방법 (0) | 2021.03.03 |
---|---|
Spring에서의 의존성주입방법 : @Autowired, @Resource 및 @Inject 방법 (0) | 2021.03.03 |
Spring batch 로 CSV(액셀) 만들기 (0) | 2020.06.27 |
Spring batch 재시도 (0) | 2020.06.25 |
Spring Batch Tasklet, Chunks 차이 및 예제 (0) | 2020.06.24 |