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
相关产品推荐
相关产品推荐

