봄 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에서 몇 가지 키워드를 설명합니다.
사용방법:
select ... like :username
List<User> findByUsernameLike(String username);
시작:
select ... like :username%
List<User> findByUsernameStartingWith(String username);
엔딩:
select ... like %:username
List<User> findByUsernameEndingWith(String username);
내용:
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를 사용하면 대소문자를 무시한 채 항목을 검색할 수 있습니다.
다음은 관련된 몇 가지 방법입니다.
맘에 들다
findByFirstnameLike
…여기서 x.first name은 ?1과 같습니다.
처음에
findByFirstnameStartingWith
여기서 x.firstname은 ?1과 같습니다(%가 추가된 파라미터).
엔딩
findByFirstnameEndingWith
여기서 x.firstname은 ?1과 같습니다(파라미터의 선두에 %가 부가됩니다).
재중
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
'programing' 카테고리의 다른 글
이름이 JPA에서 예약된 단어인 엔티티 필드를 매핑하는 방법 (0) | 2023.01.01 |
---|---|
Java 8의 기본 가비지 수집기 (0) | 2023.01.01 |
단일 테이블 쿼리 속도가 매우 느림(인덱스 사용 MariaDB (0) | 2023.01.01 |
개체의 현재 속성 및 값을 모두 인쇄하는 기능이 내장되어 있습니까? (0) | 2023.01.01 |
GROUP_CONCAT 제한 있음 (0) | 2023.01.01 |