JDBC Prepared Statement에서 LIKE 쿼리를 사용할 수 없습니까?
쿼리 코드 및 쿼리:
ps = conn.prepareStatement("select instance_id, ? from eam_measurement where resource_id in (select RESOURCE_ID from eam_res_grp_res_map where resource_group_id = ?) and DSN like '?' order by 2");
ps.setString(1,"SUBSTR(DSN,27,16)");
ps.setInt(2,defaultWasGroup);
ps.setString(3,"%Module=jvmRuntimeModule:freeMemory%");
rs = ps.executeQuery();
while (rs.next()) { bla blah blah blah ...
'비어 있다'를 합니다.ResultSet.
기본적인 디버깅을 통해 문제의 세 번째 바인드를 발견했습니다.
DSN like '?'
나는 모든 종류의 변형을 시도해 보았지만, 그 중에서 가장 합리적인 것은 다음과 같은 것을 사용하고 있는 것 같다.
DSN like concat('%',?,'%')
안 안 먹히지 않아요.',
DSN like ' concat('%',Module=P_STAG_JDBC01:poolSize,'%') ' order by 2
하지만 그 일에 그들을 끌어들일 방법을 찾을 수 없을 것 같아요.
제가 무엇을 빠뜨리고 있나요?
, ★★★★★★★★★★★★★★.PreparedStatement홀더()?things)는 표 이름, 열 이름, SQL 함수/클래스 등이 아닌 열 값만을 위한 것입니다.대신 사용하는 것이 좋습니다.둘째, 플레이스 홀더에 대해 다음과 같습니다.'?'이치노PreparedStatement이미 견적(도피) 작업을 하고 있습니다.
다음은 고정 SQL입니다.
private static final String SQL = "select instance_id, %s from eam_measurement"
+ " where resource_id in (select RESOURCE_ID from eam_res_grp_res_map where"
+ " resource_group_id = ?) and DSN like ? order by 2");
사용 방법은 다음과 같습니다.
String sql = String.format(SQL, "SUBSTR(DSN,27,16)"); // This replaces the %s.
preparedStatement = connection.prepareStatement(sql);
preparedStatement.setInt(1, defaultWasGroup);
preparedStatement.setString(2, "%Module=jvmRuntimeModule:freeMemory%");
다음 항목도 참조하십시오.
준비된 문장에서 LIKE를 사용하고 LIKE에서 % 문자를 사용하는 경우
준비된 성명서를 보통 "..."로 쓰다.LIKE ? ......" 및 파라미터 값을 물음표 사용에 할당하는 동안
ps.setString(1, "%" + "your string value" + "%");
이것으로 동작합니다. : )
당신의 진술에는 두 가지 문제가 있습니다.바인드 변수의 구조를 이해해야 합니다.문자를 대체하여 쿼리를 처리하지 않습니다.?사용할 수 있습니다.대신 플레이스 홀더를 사용하여 문이 컴파일되고 실행 중에 파라미터의 실제 값이 DB에 제공됩니다.
즉, 다음 쿼리를 해석합니다.
SELECT instance_id, :p1
FROM eam_measurement
WHERE resource_id IN (SELECT RESOURCE_ID
FROM eam_res_grp_res_map
WHERE resource_group_id = :p2)
AND DSN LIKE '?'
ORDER BY 2
마지막 파라미터는 구분문자열이기 때문에 무시됩니다.무시당하지 않는다고 해도, 그것을 가지고 있는 것은 말이 되지 않는다.'문자열에 매개 변수를 바인딩하지 않기 때문에 문자가 표시됩니다(오류가 발생하지 않은 것이 놀랍습니다. ★★★★★★★★★★★★★★★★★★★★★★★★★★★★)
이 경우, 이 기능을DNS LIKE '?'DSN LIKE ? 바인드 " " ""%Module=jvmRuntimeModule:freeMemory%"을 사용하다
첫 번째 파라미터에 아직 문제가 있습니다.예상대로 동작하지 않습니다.즉, 실행될 쿼리는 다음 쿼리와 동일합니다.
SELECT instance_id, 'SUBSTR(DSN,27,16)'
FROM ...
그것은 전혀 같지 않다
SELECT instance_id, SUBSTR(DSN,27,16)
FROM ...
만약 당신이 기판이 역동적일 것으로 예상한다면, 나는 다음 쿼리를 해석할 것을 제안합니다(=parsueStatement).
SELECT instance_id, SUBSTR(DSN,?,?)
FROM eam_measurement
WHERE resource_id IN (SELECT RESOURCE_ID
FROM eam_res_grp_res_map
WHERE resource_group_id = ?)
AND DSN LIKE ?
ORDER BY 2
를 생략합니다.'에워싸여?미포함',?는 파라미터의 플레이스 홀더입니다.이 기능을 사용하면 SQL 문자열이 됩니다(즉,"?"(Java).
그런 다음 Java 측에서 문자열을 연결해야 합니다. SQL 함수를 쿼리에 매개 변수로 전달할 수 없습니다. JDBC 드라이버는 매개 변수를 데이터베이스가 기대하는 SQL 유형으로 변환하고 이 단계에서 SQL 함수를 실행할 수 없기 때문에 기본 값(문자열, 정수 등)만 전달합니다.
다음 작업을 수행할 수 있습니다.
String beforeAndAfter = "%" + yourVariable + "%";
PreparedStatement ps = con.prepareStatement(
"select columname from tablename where LOWER(columnname) LIKE LOWER('"+var+"%')");
여기서var검색할 값이 저장되는 변수입니다.
이 조작은 유효합니다.
"\'" + "?" + "\'"
언급URL : https://stackoverflow.com/questions/2857164/cannot-use-a-like-query-in-a-jdbc-preparedstatement
'programing' 카테고리의 다른 글
| Newtonsoft JSON - 동적 객체 (0) | 2023.03.18 |
|---|---|
| 플러그인으로 WordPress 템플릿을 덮어쓸 수 있는 방법이 있습니까? (0) | 2023.03.18 |
| 조인트WP4(SASS): 스틱 속성 변경 (0) | 2023.03.18 |
| 스프링 MVC 컨트롤러 유닛테스트가 @ControllerAdvice를 호출하지 않음 (0) | 2023.03.18 |
| angular ng-if 또는 ng-show 응답이 느립니다(2초 지연) (0) | 2023.03.18 |