JPQL LIKE

이민지·2023년 1월 14일

DB

목록 보기
5/5
String query = "Select c.id, c.uuid, c.contentId, c.campName, c.firstImageUrl, c.address, c.latitude, c.longitude From Campsite c ";
String whereClause = " where";
if (keyword != null && !keyword.trim().isEmpty()) { // 검색어
     whereClause += " c.campName LIKE %:keyword%";
}
query = query + whereClause;
Query jpqlQuery = em.createQuery(query)
         .setParameter("keyword", keyword);
JpaResultMapper resultMapper = new JpaResultMapper();
return resultMapper.list(jpqlQuery, CampsiteListDTO.class);

jpql에서 LIKE를 사용하기 위해서 " c.campName LIKE %:keyword%"이렇게 작성하였는데, 아래와 같은 오류가 발생하였다.

그래서 jpql문서를 찾아보니 다음 사진처럼 %:keyword%부분을 싱글쿼테이션으로 감싸주어야 했다. 그러나 해당 부분을 싱글퀘테이션으로 감싸니 :keyword부분을 parameter로 인식을 하지 못했다.

그래서 아래처럼 코드를 작성하여 해결하였다.

String query = "Select c.id, c.uuid, c.contentId, c.campName, c.firstImageUrl, c.address, c.latitude, c.longitude From Campsite c ";
String whereClause = " where";
if (keyword != null && !keyword.trim().isEmpty()) { // 검색어
     whereClause += " c.campName LIKE '%" + keyword +"%'"
}
query = query + whereClause;
Query jpqlQuery = em.createQuery(query)
         .setParameter("keyword", keyword);
JpaResultMapper resultMapper = new JpaResultMapper();
return resultMapper.list(jpqlQuery, CampsiteListDTO.class);

[출처]https://openjpa.apache.org/builds/1.2.3/apache-openjpa/docs/jpa_langref.html#jpa_langref_like

profile
BE 개발자를 희망하는 주니어 개발자입니다.

1개의 댓글

comment-user-thumbnail
2023년 1월 26일

sql injection 문제는 없나요? 파라미터 바인딩되는 과정에서 필터링이 되는건가요?

답글 달기