source

like 절 JPQL의 매개 변수

factcode 2022. 9. 8. 21:48
반응형

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%"));
  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%")));
}

사용하다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

반응형