使用DevExtreme LoadOptions+Ignite CacheQueryable筛选列时抛查询解析异常
问题描述
使用DevExtreme LoadOptions搭配Ignite CacheQueryable时,Grid加载全量数据正常,但对列进行筛选时抛出SQL解析异常:
"Message": "42000: Failed to parse query. Column "_T0.I0" not found; SQL statement: select count (_T0.*) , _T0.I0 from "Data".ABC as _T0 group by (_T0.FILENAME) order by (_T0.I0) asc limit ? [42122-197]"
核心原因
- DevExtreme自动生成的查询引入了临时列别名I0,但该列并非实体
ABC的真实字段,Ignite SQL引擎无法识别。 - 查询不符合SQL规范:
group by FILENAME后,select中出现了未被聚合的_T0.I0,且排序依赖这个不存在的列。
解决步骤
修正DevExtreme排序/筛选配置
手动指定Grid的排序字段为实体ABC中真实存在的列(比如FILENAME),避免DevExtreme自动生成I0这类临时别名。检查LoadOptions中的Sort参数,确保排序字段名称与Ignite映射的实体字段完全一致。调整查询逻辑适配Ignite SQL规则
Ignite SQL要求group by子句中的列必须出现在select列表中,或被聚合函数包裹。比如按FILENAME分组统计数量的正确SQL应为:select _T0.FILENAME, count(_T0.*) from "Data".ABC as _T0 group by (_T0.FILENAME) order by (_T0.FILENAME) asc limit ?自定义处理LoadOptions的查询生成逻辑,替换掉自动生成的无效列
I0。改用Ignite SqlFieldsQuery替代CacheQueryable
对于复杂的筛选、分组场景,直接使用SqlFieldsQuery构建符合Ignite规范的SQL语句,将查询结果映射为Grid所需的数据格式,绕过CacheQueryable的自动生成逻辑。检查实体映射配置
确保实体类ABC中用于筛选、分组、排序的字段(如FILENAME)都添加了@QuerySqlField注解,Ignite仅会识别标记过的字段作为SQL可访问列。
内容的提问来源于stack exchange,提问作者Ahsan farid

