like 절을 사용하여 JPQL 쿼리를 작성하려고합니다.
LIKE '%:code%'
나는 code = 4를 갖고 싶습니다.
455 554 646 ...
나는 통과 할 수 없다 :code = '%value%'
namedQuery.setParameter("%" + this.value + "%");
다른 장소 :value
에서는 %
문자로 감싸지 않아도 됩니다 . 도움이 필요하세요?
like 절을 사용하여 JPQL 쿼리를 작성하려고합니다.
LIKE '%:code%'
나는 code = 4를 갖고 싶습니다.
455 554 646 ...
나는 통과 할 수 없다 :code = '%value%'
namedQuery.setParameter("%" + this.value + "%");
다른 장소 :value
에서는 %
문자로 감싸지 않아도 됩니다 . 도움이 필요하세요?
답변:
만약 당신이
LIKE :code
그리고
namedQuery.setParameter("code", "%" + this.value + "%");
그러면 값은 '%'기호에서 자유 로워집니다. 동일한 쿼리의 다른 곳에서 사용해야하는 경우 'code'이외의 다른 매개 변수 이름을 사용하면됩니다.
"%" + this.value + "%"
이스케이프 된 것입니다.
모든 쿼리에 명명 된 매개 변수를 사용하지 않습니다. 예를 들어 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
JPA LOCATE 함수를 사용할 수 있습니다 .
LOCATE (searchString, 후보 문자열 [, startIndex]) : 후보 문자열에서 검색 문자열의 첫 번째 인덱스를 반환합니다. 위치는 1 기반입니다. 문자열이 없으면 0을 반환합니다.
참고 : 내 최고의 Google 히트 문서에 매개 변수가 반전되었습니다.
SELECT
e
FROM
entity e
WHERE
(0 < LOCATE(:searchStr, e.property))
내가 늦었는지 또는 범위를 벗어 났는지 모르겠지만 내 의견으로는 다음과 같이 할 수 있습니다.
String orgName = "anyParamValue";
Query q = em.createQuery("Select O from Organization O where O.orgName LIKE '%:orgName%'");
q.setParameter("orgName", orgName);
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%"));
select i from Instructor i where i.address LIKE CONCAT('%',:address ,'%')");
@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%")));
}
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());
}
}