You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 19:52:39