[에러] No property '하' found for type 'Book' Did you mean ''id'' with root cause

2022.11.19

발생

  • 검색 기능 구현 중 검색 키워드로 '하'를 적은 후 리턴했을 때 발생

bookRe_img

원인

  • bookRepository의 query 형태 규칙 오류
  • findByTitle로 명시할 경우 '하%'나 '%하%' 형태의 검색어를 포함하지 않고 '하' 형태로만 검색됨.

오류 코드

  • ** 간소화로 인해 코드 중 일부 생략된 부분이 있을 수 있습니다.
    Page<Book> findByTitle(String title, Pageable pageable);

    public default List<Book> findByTitle(Pagination pagination) {
        Page<Book> page = this.findByTitleContainingIgnoreCase(pagination.getKeyword() + "%", PageRequest
                .of(pagination.getPg() - 1, pagination.getSz(), Sort.Direction.ASC, "id"));
        pagination.setRecordCount((int) page.getTotalElements());
        return page.getContent();
    }

해결

  • Containing와 IgnoreCase의 조건 붙이기

해결 코드

  • containing : 해당 문자가 포함하는 것 찾기

  • ignoreCase : 대소문자 구분 X

  • ** 간소화로 인해 코드 중 일부 생략된 부분이 있을 수 있습니다.

    Page<Book> findByTitleContainingIgnoreCase(String title, Pageable pageable);

    public default List<Book> findByTitleContainingIgnoreCase(Pagination pagination) {
        Page<Book> page = this.findByTitleContainingIgnoreCase(pagination.getKeyword(), PageRequest
                .of(pagination.getPg() - 1, pagination.getSz(), Sort.Direction.ASC, "id"));
        pagination.setRecordCount((int) page.getTotalElements());
        return page.getContent();
    }

JPA Query 살펴보기

1. LIKE 쿼리를 수행하는 방법

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

2. Containing , Contains 및 IsContaining 사용하여 쿼리 메서드를 정의

  • Contains vs Containing vs IsContaining : 키워드 간의 차이점 없음

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

3. 쿼리 메서드 호출


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());

4. Like 키워드로 같은 기능 구현

  • Spring은 또한 Like 키워드를 제공
  • 단, 다른 점은 와일드카드 문자를 검색 매개변수와 함께 제공해야 함.

List<Movie> findByTitleLike(String title);


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


참고자료 : jpa query