Ignite中SqlFieldsQuery使用like无结果问题求助
问题分析与解决办法
你遇到的问题核心是SQL参数占位符的使用方式错误,导致查询框架没有正确解析参数绑定,具体原因和解决办法如下:
问题根源
你写的SQL语句里,把参数占位符?放在了单引号内部:
private final static String QUERY_2_GET_ID = "select reg." + Cache.EVENT_DT + " from " + CACHE_TABLE_NAME + " as reg" + " where " + Cache.ID + " like '?%'";
从cache.query和FieldsQueryCursor来看,你应该是在用类似Ignite这类缓存查询框架,这类框架会把单引号内的内容当作字面量字符串处理——也就是说这里的?不会被识别为参数占位符,而是直接作为?字符参与匹配。所以你的代码实际执行的是匹配以?开头的ID,而非你传入的id值开头的ID,自然查不到结果。
而你在SQL控制台执行时,应该是手动把?替换成了实际的id值(比如写成like 'abc%'),所以能正常返回结果。
解决办法
你需要调整SQL写法,让参数占位符正确被识别,同时保留%的前缀匹配逻辑,有两种常用方案:
方案1:在SQL中用concat拼接占位符和通配符
把SQL改成用concat函数将参数和%拼接,让占位符?脱离单引号的包裹:
private final static String QUERY_2_GET_ID = "select reg." + Cache.EVENT_DT + " from " + CACHE_TABLE_NAME + " as reg" + " where " + Cache.ID + " like concat(? , '%')";
参数绑定部分保持不变:
FieldsQueryCursor<List<?>> queryResult = cache.query(QUERY_2_GET_ID.setArgs(id));
方案2:在参数中拼接通配符
让SQL的占位符单独存在,然后在传入参数时把%直接拼接到id后面:
private final static String QUERY_2_GET_ID = "select reg." + Cache.EVENT_DT + " from " + CACHE_TABLE_NAME + " as reg" + " where " + Cache.ID + " like ?";
参数绑定修改为:
FieldsQueryCursor<List<?>> queryResult = cache.query(QUERY_2_GET_ID.setArgs(id + "%"));
这两种方案都能实现你需要的「以指定id前缀匹配」的逻辑,同时让框架正确解析参数绑定,解决无结果返回的问题。
内容的提问来源于stack exchange,提问作者Miklosh
相关产品推荐
相关产品推荐

