[java] 스프링 JpaRepository의 % Like % 쿼리

같은 쿼리를 작성하고 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);
}



답변

스프링 데이터 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);

충분하다.


답변

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

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

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

    List<Registration> findByPlaceIgnoreCaseContaining(String place);

    }


답변

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

List<Registration> findByPlaceContaining(String place);


답변

귀하의 경우에는 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 (파라미터 경계가 %로 래핑 됨)

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

이것이 당신을 도울 것입니다 🙂


답변

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

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


답변

이 시도.

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


답변

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

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

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