有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java不能在JDBC PreparedStatement中使用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

但我似乎找不到办法让他们这么做

我错过了什么


共 (6) 个答案

  1. # 1 楼答案

    PreparedStatement ps = con.prepareStatement(
        "select columname from tablename where LOWER(columnname) LIKE LOWER('"+var+"%')");  
    

    这里var是存储要搜索的值的变量

  2. # 2 楼答案

    你的陈述有两个问题。你必须了解绑定变量是如何工作的。查询不是通过用参数替换字符?来处理的。相反,使用占位符编译语句,然后在执行期间,将参数的实际值提供给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
    

    我很确定最后一个参数将被忽略,因为它位于分隔字符串中。即使它没有被忽略,也没有必要使用'字符,因为Oracle不会将参数绑定到字符串中(我很惊讶它没有引发任何错误,是否捕获异常?)

    现在,如果用DSN LIKE ?替换DNS LIKE '?'并绑定"%Module=jvmRuntimeModule:freeMemory%",这将是有意义的,并且应该返回正确的行

    您的第一个参数仍然存在问题,它不会执行您预期的操作,即将执行的查询将等效于以下查询:

    SELECT instance_id, 'SUBSTR(DSN,27,16)'
      FROM ...
    

    这和

    SELECT instance_id, SUBSTR(DSN,27,16)
      FROM ...
    

    如果希望SUBSTR是动态的,我建议解析(=prepareStatement)以下查询:

    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
    
  3. # 3 楼答案

    你可以试试:

    String beforeAndAfter = "%" + yourVariable + "%";
    
  4. # 4 楼答案

    省略?周围的'。没有'?是参数的占位符。它是一个SQL字符串(即与Java中的"?"相同)

    然后必须在Java端连接字符串;不能将SQL函数作为参数传递给查询;因为JDBC驱动程序会将参数转换为数据库所需的SQL类型,并且在此步骤中无法执行SQL函数,所以只能使用基本值(如字符串、整数等)

  5. # 5 楼答案

    首先,PreparedStatement占位符(那些?东西)只用于列值,不用于表名、列名、SQL函数/子句等。最好改用^{}。其次,你应该而不是引用像'?'这样的占位符,这只会使最终的查询格式错误。{}setter已经为您完成了引用(和转义)工作

    以下是固定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%");
    

    另见

  6. # 6 楼答案

    如果您想在准备好的语句中使用LIKE,并且想在LIKE中使用%字符

    像平常一样写准备好的陈述书“……比如……”并在为问号指定参数值时使用

    ps.setString(1, "%" + "your string value" + "%");

    这将奏效:)