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

Apache Ignite Spring Data 2.0自定义查询解析异常求助

Apache Ignite Spring Data 2.0 自定义查询SQL解析错误问题解决

问题场景

我在使用Apache Ignite Spring Data 2.0时碰到了一个棘手的问题:IgniteRepository自带的查询方法(比如findById、findAll)都能正常跑起来,但自定义查询方法(比如findAllByClientId)或者用@Query注解写的查询,都会抛出SQL解析异常。后来偶然试了下把实体类名从Order改成Order1,所有查询居然都正常工作了。

示例代码

自定义Repository代码

@RepositoryConfig(cacheName = "orders")
public interface OrderRepository extends IgniteRepository<Order, Long> {
    List<Order> findAllByClientId(Long clientId);
}

缓存配置代码

@TestConfiguration
@EnableIgniteRepositories("repositories")
public class RepositoriesTestConfig {
    @Bean("igniteCfg")
    public IgniteConfiguration igniteConfiguration() {
        IgniteConfiguration igniteConfiguration = new IgniteConfiguration();
        igniteConfiguration.setClientMode(false);
        igniteConfiguration.setIgniteInstanceName(instanceName);
        igniteConfiguration.setPeerClassLoadingEnabled(true);
        CacheConfiguration<Long, Order> ordersCacheConfiguration = new CacheConfiguration<>("orders");
        ordersCacheConfiguration.setIndexedTypes(Long.class, Order.class);
        igniteConfiguration.setCacheConfiguration(ordersCacheConfiguration);
        return igniteConfiguration;
    }
    @Bean("igniteInstance")
    public Ignite igniteInstance(@Autowired IgniteConfiguration igniteConfiguration) {
        final Ignite ignite = Ignition.start(igniteConfiguration);
        return ignite;
    }
}

报错信息

javax.cache.CacheException: Failed to parse query. Syntax error in SQL statement "SELECT ""orders""".""ORDER"""._KEY, ""orders""".""ORDER"""._VAL FROM ORDER[*] WHERE ((ORDER.CLIENTID=?)) "; expected "identifier"; SQL statement: SELECT "orders"."ORDER"._KEY, "orders"."ORDER"._VAL FROM Order WHERE ((Order.clientId=?)) [42001-197]

根因分析

问题的核心是**Order是SQL的保留关键字**。Ignite Spring Data生成SQL查询时,会直接用实体类名作为表名,但对SQL关键字的转义处理存在缺陷,导致SQL解析器把FROM Order里的Order当成了SQL关键字,而不是表名,最终触发语法错误。

解决方案

你可以选下面两种方式解决这个问题:

  • 方案1:重命名实体类
    最简单直接的办法就是避开SQL关键字作为类名,比如把Order改成CustomerOrder、OrderEntity或者Order1(就像你测试的那样),这样生成的SQL表名不会和关键字冲突,查询就能正常执行。

  • 方案2:给实体类设置SQL别名
    要是不想修改类名,可以在Order实体类上添加@SqlAlias注解,指定一个非关键字的别名,让Ignite生成SQL时用这个别名代替类名:

    @SqlAlias("CUSTOMER_ORDER")
    public class Order {
        // 实体类字段和方法
    }
    

    这样Ignite生成的SQL会用CUSTOMER_ORDER作为表名,避免和SQL关键字ORDER冲突,自定义查询就能正常工作了。

内容的提问来源于stack exchange,提问作者bausov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 03:48:36