[java] LIKE를 사용한 Spring JPA @Query

CrudRepository에서 사용자 이름이 입력 매개 변수와 같은 사용자 목록을 제공 할 수있는 메서드를 만들려고합니다 (시작할뿐만 아니라 포함). 나는 방법을 사용하려고했지만 "findUserByUsernameLike(@Param("username") String username)"Spring 문서에서 말했듯이이 방법은 ” where user.username like ?1“와 같다. 사용자 이름에 포함 된 모든 사용자를 얻으려고 이미 말했듯이 나에게 좋지 않습니다.

메서드에 대한 쿼리를 작성했지만 배포되지도 않습니다.

@Repository
public interface UserRepository extends CrudRepository<User, Long> {

@Query("select u from user u where u.username like '%username%'")
List<User> findUserByUsernameLike(@Param("username") String username);
}

아무도 이것으로 나를 도울 수 있습니까?



답변

다음 접근 방식을 사용하십시오 (나에게 적합합니다).

@Query("SELECT u.username FROM User u WHERE u.username LIKE CONCAT('%',:username,'%')")
List<String> findUsersWithPartOfName(@Param("username") String username);

주의 : JPQL의 테이블 이름은 대문자로 시작해야합니다.


답변

메소드 이름에서 쿼리 작성을 사용하여 일부 키워드를 설명하는 표 4를 확인하십시오.

  1. Like 사용 : select … like : username

    List<User> findByUsernameLike(String username);
  2. 시작 : 선택 … like : username %

    List<User> findByUsernameStartingWith(String username);
  3. EndingWith : 선택 … like % : username

    List<User> findByUsernameEndingWith(String username);
  4. 포함 : 선택 … like % : username %

    List<User> findByUsernameContaining(String username);

당신이 찾고있는 답이 4 번 이라는 것을 주목하세요 . @Query를 사용할 필요가 없습니다.


답변

다른 방법 : CONCAT함수 대신 이중 파이프를 사용할 수 있습니다. : lastname || ‘%’

@Query("select c from Customer c where c.lastName LIKE :lastname||'%'")
List<Customer> findCustomByLastName( @Param("lastname") String lastName);

어디에나 접두사, 접미사 또는 둘 다를 넣을 수 있습니다.

:lastname ||'%'
'%' || :lastname
'%' || :lastname || '%'  


답변

List<User> findByUsernameContainingIgnoreCase(String username);

케이스 문제를 무시하기 위해


답변

사용하기 쉬운 다음 (CONCAT 또는 ||을 사용할 필요 없음) :

@Query("from Service s where s.category.typeAsString like :parent%")
List<Service> findAll(@Param("parent") String parent);

문서화 : http://docs.spring.io/spring-data/jpa/docs/current/reference/html .


답변

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

포함 : 선택 … like % : username %

List<User> findByUsernameContainingIgnoreCase(String username);

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

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

  1. 처럼 findByFirstnameLike

    … x.firstname like? 1

  2. 로 시작 findByFirstnameStartingWith

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

  3. EndingWith findByFirstnameEndingWith

    … 여기서 x.firstname은? 1 (앞에 %가 붙은 매개 변수)

  4. 포함 findByFirstnameContaining

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

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

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


답변

이 방법은 나를 위해 작동합니다 (Spring Boot 버전 2.0.1. RELEASE 사용).

@Query("SELECT u.username FROM User u WHERE u.username LIKE %?1%")
List<String> findUsersWithPartOfName(@Param("username") String username);

설명 😕 1,? 2,? 3 등은 첫 번째, 두 번째, 세 번째 매개 변수 등의 자리 표시 자입니다.이 경우 매개 변수를 표준 SQL 쿼리 인 것처럼 %로 둘러싸기에 충분하지만 작은 따옴표.