programing

봄 JPA @LIKE와 함께 쿼리

luckcodes 2023. 1. 1. 12:11

봄 JPA @LIKE와 함께 쿼리

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의 테이블 이름은 대문자로 시작해야 합니다.

메서드 이름에서 Query creation을 사용하여 표 4에서 몇 가지 키워드를 설명합니다.

  1. 사용방법:select ... like :username

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

     List<User> findByUsernameStartingWith(String username);
    
  3. 엔딩:select ... like %:username

     List<User> findByUsernameEndingWith(String username);
    
  4. 내용:select ... 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 || '%'  

사용하기 쉬운 (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

List<User> findByUsernameContainingIgnoreCase(String username);

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

이 경우 JPA 메서드를 직접 사용할 수 있습니다.그건 마치 벨로우 같다:

내용: 선택...예를 들어 %: 149%

List<User> findByUsernameContainingIgnoreCase(String username);

여기서 Ignore Case를 사용하면 대소문자를 무시한 채 항목을 검색할 수 있습니다.

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

  1. 맘에 들다 findByFirstnameLike

    …여기서 x.first name은 ?1과 같습니다.

  2. 처음에 findByFirstnameStartingWith

    여기서 x.firstname은 ?1과 같습니다(%가 추가된 파라미터).

  3. 엔딩 findByFirstnameEndingWith

    여기서 x.firstname은 ?1과 같습니다(파라미터의 선두에 %가 부가됩니다).

  4. 재중 findByFirstnameContaining

    여기서 x.firstname은 ?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 쿼리인 것처럼 %로 둘러싸지만 단일 따옴표는 사용하지 않아도 됩니다.

username 파라미터 앞에 콜론(:)이 없습니다.따라서 코드는 다음 항목에서 변경해야 합니다.

@Query("select u from user u where u.username like '%username%'")

대상:

@Query("select u from user u where u.username like '%:username%'")

★★★★★★★★★★★★★★★★★」@Query("select u from user u where u.username like '%:username%'")동작하지 않는 경우도 있습니다.

나에게 있어서 효과적인 해결책은

@Query("SELECT u.username FROM User u WHERE u.username LIKE CONCAT('%',:username,'%')")

Spring-Data-Jpa +2.7을 사용하는 경우 쿼리에서 %:param%를 사용하는 LIKE 파라미터 버그가 있습니다.버전 3에서 수정될 예정입니다.

https://github.com/spring-projects/spring-data-jpa/issues/2548

@Query("select u from user u where u.username LIKE :username")
List<User> findUserByUsernameLike(@Param("username") String username);
@Query("select b.equipSealRegisterId from EquipSealRegister b where b.sealName like %?1% and b.deleteFlag = '0'" )
    List<String>findBySeal(String sealname);

이 코드를 시험해 봤는데 작동해요.

언급URL : https://stackoverflow.com/questions/21456494/spring-jpa-query-with-like