스프링 JpaRepository의 % Like % 쿼리


110

같은 쿼리를 작성하고 JpaRepository싶지만 아무것도 반환하지 않습니다.

LIKE '%place%'-작동하지 않습니다.

LIKE 'place' 완벽하게 작동합니다.

내 코드는 다음과 같습니다.

@Repository("registerUserRepository")
public interface RegisterUserRepository extendsJpaRepository<Registration,Long> {

    @Query("Select c from Registration c where c.place like :place")
     List<Registration> findByPlaceContaining(@Param("place")String place);
}

답변:


199

스프링 데이터 JPA 쿼리에는 다음과 같이 "%"문자와 like쿼리 뒤에 공백 문자가 필요합니다 .

@Query("Select c from Registration c where c.place like %:place%").

Cf. http://docs.spring.io/spring-data/jpa/docs/current/reference/html .

@Query표준 쿼리 (스프링 데이터 프록시에 의해 자동으로 구현 됨)와 유사한 것처럼 보이 므로 주석을 모두 제거 할 수 있습니다 . 즉 한 줄 사용

List<Registration> findByPlaceContaining(String place);

충분하다.


23
다음을 사용하여 쿼리의 대소 문자를 무시하는 것도 유용 할 수 있습니다. findByPlaceIgnoreCaseContaining (String place);
ilyailya

사이드 코멘트처럼-동일한 쿼리 내에서 % : param %와 % param %을 혼합하여 일치시킬 수 없습니다. 그렇지 않으면 앱이 시작되지 않습니다.
RVP

감사합니다. 나는 쓰기를 사용 like '%:place%'하여 '및 최대 절전 모드가 추가되므로 전혀 결과는 없었다 '자체로 스트링들.
Yamashiro Rion

이것은 좋은 반응이 아니며 잠재적으로 위험 할 수도 있습니다. Spring은 ContainingIgnoreCase로 이것을 분류했습니다. 내 대답을 확인하십시오.
Alexius DIAKOGIANNIS

99

실제로 @Query주석이 전혀 필요하지 않습니다.

다음을 사용할 수 있습니다.

    @Repository("registerUserRepository")
    public interface RegisterUserRepository extends JpaRepository<Registration,Long>{

    List<Registration> findByPlaceIgnoreCaseContaining(String place);

    }

나에게 이것은 최고의 솔루션입니다. Containing과 함께 IgnoreCase를 사용할 수 있다는 것을 몰랐습니다. 문서에 없습니다.
Wilson Campusano

1
많은 열을 사용하려는 경우는 어떻게됩니까? -필수품이라고 생각 해요 @Query()? 그 방법으로 내가 할 것이다 or: 그 사실이 경우에 대한 적합 해결책이 아니다findByField1OrField2Containg(String phraseForField1, String phraseForField2)
user3529850

26

SpringData JPA 지원 키워드 "Containing"을 사용하여 유사 쿼리를 구현할 수도 있습니다 .

List<Registration> findByPlaceContaining(String place);

20

귀하의 경우에는 JPA 방법을 직접 사용할 수 있습니다. 그것은 다음과 같습니다.

포함 : select ... like % : place %

List<Registration> findByPlaceContainingIgnoreCase(String place);

여기서 IgnoreCase 는 케이스를 무시하고 항목을 검색하는 데 도움이됩니다.

JPQL에서 @Query 사용 :

@Query("Select registration from Registration registration where 
registration.place LIKE  %?1%")
List<Registration> findByPlaceContainingIgnoreCase(String place);

다음은 몇 가지 관련 방법입니다.

  1. 처럼 findByPlaceLike

    … x.place는? 1

  2. 로 시작 findByPlaceStartingWith

    … 여기서 x.place like? 1 (파라미터는 %가 추가됨)

  3. EndingWith findByPlaceEndingWith

    … x.place like? 1 (파라미터는 %로 묶여 있음)

  4. 포함 findByPlaceContaining

    … x.place like? 1 (파라미터 경계가 %로 래핑 됨)

추가 정보, 이 링크 보기 , 이 링크

이것이 당신을 도울 것입니다 :)


6

자리 표시자를 다음과 같이 사용하는 대안 중 하나를 사용할 수 있습니다.

@Query("Select c from Registration c where c.place LIKE  %?1%")
List<Registration> findPlaceContainingKeywordAnywhere(String place);

4

이 시도.

@Query("Select c from Registration c where c.place like '%'||:place||'%'")

우리가 사용 something=:place하고 another like %:place%쿼리 하면 유용 합니다.
hong4rc

1

통화 기능을 사용할 때 다음을 사용합니다. findByPlaceContaining("%" + place);

또는: findByPlaceContaining(place + "%");

또는: findByPlaceContaining("%" + place + "%");


1

대답은 정확히

->`@Query ( "select u from Category u where u.categoryName like % : input %")
     목록 findAllByInput (@Param ( "input") 문자열 입력);

0

없는 솔루션을 찾았습니다. @Query (실제로 "수락"된 것을 시도했지만 작동하지 않았습니다).

Page<Entity>대신 반환해야 합니다 List<Entity>.

public interface EmployeeRepository 
                          extends PagingAndSortingRepository<Employee, Integer> {
    Page<Employee> findAllByNameIgnoreCaseStartsWith(String name, Pageable pageable);
}

IgnoreCase 부분은 이것을 달성하는 데 중요했습니다!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.