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
sql injection 문제는 없나요? 파라미터 바인딩되는 과정에서 필터링이 되는건가요?