like 절 JPQL의 매개 변수
JPQL 쿼리를 다음과 같은 절로 작성하려고 합니다.
LIKE '%:code%'
code=4로 검색해 주세요.
455554646...
통과할 수 없다:code = '%value%'
namedQuery.setParameter("%" + this.value + "%");
왜냐하면 다른 곳에서:value
에 싸여 있지 않다%
차스 좀 도와줄까?
네가 한다면.
LIKE :code
그리고 나서 한다.
namedQuery.setParameter("code", "%" + this.value + "%");
그러면 값이 '%' 기호에서 해방됩니다.같은 쿼리에서 다른 곳에서 사용해야 할 경우 'code' 이외의 다른 파라미터 이름을 사용하십시오.
모든 쿼리에 대해 명명된 매개 변수를 사용하지 않습니다.예를 들어 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, candidateString [, 시작)인덱스])candidateString 내의 searchString의 첫 번째 인덱스를 반환합니다.포지션은 1 베이스입니다.문자열을 찾을 수 없는 경우 0을 반환합니다.
참고로, 제 톱 구글 히트 문서의 파라미터는 거꾸로 되어 있었습니다.
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%"));
- 아래의 JPQL 쿼리를 사용합니다.
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());
}
}
'는 빼주세요.
LIKE %:code%
언급URL : https://stackoverflow.com/questions/1341104/parameter-in-like-clause-jpql
'source' 카테고리의 다른 글
페이지 로드 후 JavaScript를 실행하는 방법 (0) | 2022.09.08 |
---|---|
Javascript에서 문자열로 사용되는 변수 이름 (0) | 2022.09.08 |
플랫 파일 데이터베이스 (0) | 2022.09.08 |
MySQL vs MySQLi(PHP 사용 시) (0) | 2022.09.08 |
Java에서 URL 쿼리 매개 변수 인코딩 (0) | 2022.09.08 |