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
但我似乎找不到办法让他们这么做
我错过了什么
# 1 楼答案
这里
var
是存储要搜索的值的变量# 2 楼答案
你的陈述有两个问题。你必须了解绑定变量是如何工作的。查询不是通过用参数替换字符
?
来处理的。相反,使用占位符编译语句,然后在执行期间,将参数的实际值提供给DB换句话说,您将解析以下查询:
我很确定最后一个参数将被忽略,因为它位于分隔字符串中。即使它没有被忽略,也没有必要使用
'
字符,因为Oracle不会将参数绑定到字符串中(我很惊讶它没有引发任何错误,是否捕获异常?)现在,如果用
DSN LIKE ?
替换DNS LIKE '?'
并绑定"%Module=jvmRuntimeModule:freeMemory%"
,这将是有意义的,并且应该返回正确的行您的第一个参数仍然存在问题,它不会执行您预期的操作,即将执行的查询将等效于以下查询:
这和
如果希望SUBSTR是动态的,我建议解析(=prepareStatement)以下查询:
# 3 楼答案
你可以试试:
# 4 楼答案
省略
?
周围的'
。没有'
,?
是参数的占位符。它是一个SQL字符串(即与Java中的"?"
相同)然后必须在Java端连接字符串;不能将SQL函数作为参数传递给查询;因为JDBC驱动程序会将参数转换为数据库所需的SQL类型,并且在此步骤中无法执行SQL函数,所以只能使用基本值(如字符串、整数等)
# 5 楼答案
首先,} 。其次,你应该而不是引用像}setter已经为您完成了引用(和转义)工作
PreparedStatement
占位符(那些?
东西)只用于列值,不用于表名、列名、SQL函数/子句等。最好改用^{'?'
这样的占位符,这只会使最终的查询格式错误。{以下是固定SQL:
下面是如何使用它:
另见:
# 6 楼答案
如果您想在准备好的语句中使用LIKE,并且想在LIKE中使用%字符
像平常一样写准备好的陈述书“……比如……”并在为问号指定参数值时使用
ps.setString(1, "%" + "your string value" + "%");
这将奏效:)