Apache Ignite使用LINQ查询SQL创建表时报错无法解析Java类
错误原因
该错误由两个核心问题共同导致:
- 通过SQL DDL创建表时,指定的
VALUE_TYPE = consoleappserver.Thing没有明确标注.NET平台标识,Ignite服务端默认将其识别为Java类,查找对应类失败。 - 采用SQL INSERT插入数据时,Ignite不会自动关联.NET端
Thing类的二进制元数据,当你用强类型LINQ查询尝试反序列化数据时,服务端无法解析对应.NET类型的类型描述。
修复方案
可任选以下任意一种方案解决:
方案1:改用KV API插入数据
插入数据时直接使用键值对API写入Thing类实例,Ignite会自动注册.NET类型元数据,后续LINQ查询可正常反序列化:
var thingCache = cli.GetCache<Guid, Thing>("consoleappserver.Thing"); // 插入示例 thingCache.Put( Guid.NewGuid(), new Thing { Id = Guid.NewGuid(), Name = "Test Name 1", EffectiveDate = DateTime.SpecifyKind(DateTime.Today, DateTimeKind.Utc) });
方案2:保留SQL操作,补充类型注册与标识
如果必须使用SQL完成建表和数据插入,做两处调整即可:
- 初始化Ignite客户端时,在配置中提前注册
Thing类的二进制元数据:
var clientCfg = new IgniteClientConfiguration { // 其他原有配置保留 BinaryConfiguration = new BinaryConfiguration { Types = new[] { typeof(Thing).FullName } } };
- 修改建表SQL的WITH子句,给VALUE_TYPE添加.NET平台前缀:
WITH "TEMPLATE = PARTITIONED, CACHE_NAME = consoleappserver.Thing, VALUE_TYPE = dotnet:consoleappserver.Thing"
方案3:手动映射查询结果
不需要修改现有建表、插入逻辑的情况下,放弃强类型LINQ,改用SqlFieldsQuery查询后手动映射到Thing类:
var effectiveDate = DateTime.SpecifyKind(DateTime.Today, DateTimeKind.Utc); var queryRes = cache.Query(new SqlFieldsQuery( @"SELECT Id, Name, EffectiveDate FROM Things WHERE EffectiveDate <= ?", effectiveDate )).GetAll(); foreach (var row in queryRes) { var thing = new Thing { Id = (Guid)row[0], Name = (string)row[1], EffectiveDate = (DateTime)row[2] }; Console.WriteLine("Things #{0} '{1}'", thing.Id, thing.Name); }
内容的提问来源于stack exchange,提问作者herme 0
相关产品推荐
相关产品推荐

