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

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完成建表和数据插入,做两处调整即可:

  1. 初始化Ignite客户端时,在配置中提前注册Thing类的二进制元数据:
var clientCfg = new IgniteClientConfiguration
{
    // 其他原有配置保留
    BinaryConfiguration = new BinaryConfiguration
    {
        Types = new[] { typeof(Thing).FullName }
    }
};
  1. 修改建表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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 15:45:03