programing

JDBC Prepared Statement에서 LIKE 쿼리를 사용할 수 없습니까?

iphone6s 2023. 3. 18. 08:22
반응형

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

반응형