유사 절 JPQL의 매개 변수


90

like 절을 사용하여 JPQL 쿼리를 작성하려고합니다.

LIKE '%:code%'

나는 code = 4를 갖고 싶습니다.

455
554
646
...

나는 통과 할 수 없다 :code = '%value%'

namedQuery.setParameter("%" + this.value + "%");

다른 장소 :value에서는 %문자로 감싸지 않아도 됩니다 . 도움이 필요하세요?


2
@Manuele Piastra : 아래 답변이 당신이 찾고 있던 것이 아닙니까?
wmorrison365

답변:


169

만약 당신이

LIKE :code

그리고

namedQuery.setParameter("code", "%" + this.value + "%");

그러면 값은 '%'기호에서 자유 로워집니다. 동일한 쿼리의 다른 곳에서 사용해야하는 경우 'code'이외의 다른 매개 변수 이름을 사용하면됩니다.


9
기록을 위해 this.value는 자동으로 적절하게 이스케이프되므로 JPQL 주입 공격에 노출되지 않습니다.
László van den Hoek

3
이것이 "%" + this.value + "%"이스케이프 된 것입니다.
Gustavo

2
대소 문자를 구분하지 않으려면 어떻게해야합니까?
EM-Creations

55

모든 쿼리에 명명 된 매개 변수를 사용하지 않습니다. 예를 들어 JpaRepository 에서 명명 된 매개 변수를 사용하는 것은 드문 경우입니다. .

해결 방법으로 JPQL CONCAT 함수를 사용 합니다 (이 코드는으로 시작을 에뮬레이트 ).

@Repository
public interface BranchRepository extends JpaRepository<Branch, String> {
    private static final String QUERY = "select b from Branch b"
       + " left join b.filial f"
       + " where f.id = ?1 and b.id like CONCAT(?2, '%')";
    @Query(QUERY)
    List<Branch> findByFilialAndBranchLike(String filialId, String branchCode);
}

이 기술은 우수한 문서에서 찾았습니다. http://openjpa.apache.org/builds/1.0.1/apache-openjpa-1.0.1/docs/manual/jpa_overview_query.html


2
참고 : CONCAT (? 2, '%')는 매개 변수 끝에 '%'를 추가하고 CONCAT ( '%',? 2, '%')를 사용하여 매개 변수의 시작과 끝에 추가합니다.
Muizz Mahdy

7

JPA LOCATE 함수를 사용할 수 있습니다 .

LOCATE (searchString, 후보 문자열 [, startIndex]) : 후보 문자열에서 검색 문자열의 첫 번째 인덱스를 반환합니다. 위치는 1 기반입니다. 문자열이 없으면 0을 반환합니다.

참고 : 내 최고의 Google 히트 문서에 매개 변수가 반전되었습니다.

SELECT 
  e
FROM 
  entity e
WHERE
  (0 < LOCATE(:searchStr, e.property))

1
나를 위해 최고의 솔루션-연결 없음, SQL 주입 없음.
hgoebl

4

내가 늦었는지 또는 범위를 벗어 났는지 모르겠지만 내 의견으로는 다음과 같이 할 수 있습니다.

String orgName = "anyParamValue";

Query q = em.createQuery("Select O from Organization O where O.orgName LIKE '%:orgName%'");

q.setParameter("orgName", orgName);

2

JPA 기준 API에는 멋진 like () 메소드가 있습니다. 그것을 사용하십시오, 그것이 도움이되기를 바랍니다.

CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery criteriaQuery = cb.createQuery(Employees.class);
Root<Employees> rootOfQuery = criteriaQuery.from(Employees.class);
criteriaQuery.select(rootOfQuery).where(cb.like(rootOfQuery.get("firstName"), "H%"));

1
  1. 아래 JPQL 쿼리를 사용하십시오.
select i from Instructor i where i.address LIKE CONCAT('%',:address ,'%')");
  1. 동일한 기준 코드 아래 사용 :
@Test
public void findAllHavingAddressLike() {
    CriteriaBuilder cb = criteriaUtils.criteriaBuilder();
    CriteriaQuery<Instructor> cq = cb.createQuery(Instructor.class);
    Root<Instructor> root = cq.from(Instructor.class);
    printResultList(cq.select(root).where(
        cb.like(root.get(Instructor_.address), "%#1074%")));
}

0

그냥 ''

LIKE %:code%

Downvote : 작동하지 않음, 매개 변수 이름을 code %로 변경
kaiser

0

JpaRepository또는 CrudRepository저장소 인터페이스로 사용 :

@Repository
public interface CustomerRepository extends JpaRepository<Customer, Integer> {

    @Query("SELECT t from Customer t where LOWER(t.name) LIKE %:name%")
    public List<Customer> findByName(@Param("name") String name);

}


@Service(value="customerService")
public class CustomerServiceImpl implements CustomerService {

    private CustomerRepository customerRepository;
    
    //...

    @Override
    public List<Customer> pattern(String text) throws Exception {
        return customerRepository.findByName(text.toLowerCase());
    }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.