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

Spring GraphQL中Union类型实现报错及解决方案咨询

问题解决:GraphQL Union类型查询报错

错误原因

报错提示"You have asked for named object type 'Tables', but it's not an object type but rather a 'graphql.schema.GraphQLUnionType'",核心原因:

  • GraphQL的Union类型不属于对象类型范畴,不能直接作为列表元素进行无差别查询,必须通过inline fragment明确指定每个Union成员类型的查询字段
  • 原Schema中Union成员类型名使用小写(address、identifier),不符合GraphQL类型名PascalCase的规范,可能引发类型映射异常

解决方案步骤

  1. 修正GraphQL Schema,确保Union成员为合法的PascalCase命名对象类型,并补充对象类型的字段定义
  2. 修改查询语句,通过inline fragment指定每个Union成员的查询字段
  3. 调整Java代码,确保返回类型能被Spring GraphQL正确识别为Union类型的集合

修改后的代码示例

1. 修正后的GraphQL Schema

type Query {
  getData: [Tables]
}

# Union类型成员使用PascalCase命名规范
union Tables = Address | Identifier

# 定义Address对象类型及对应字段(根据你的Hibernate实体补充)
type Address {
  id: ID!
  street: String
  city: String
}

# 定义Identifier对象类型及对应字段(根据你的Hibernate实体补充)
type Identifier {
  id: ID!
  code: String
  type: String
}

2. 正确的查询语句(必须包含inline fragment)

query allData {
  getData {
    __typename
    # 针对Address类型的字段查询
    ... on Address {
      id
      street
      city
    }
    # 针对Identifier类型的字段查询
    ... on Identifier {
      id
      code
      type
    }
  }
}

3. 调整后的Java查询方法

@QueryMapping
public List<Object> getData() {
    // 可混合返回Address和Identifier实例,Spring GraphQL会自动识别类型
    return List.of(new Address(1L, "Main St", "New York"), new Identifier(2L, "USER_001", "USER"));
}

额外说明

  • 确保Hibernate实体Address和Identifier已被Spring GraphQL正确映射为对应的GraphQL对象类型(可通过@GraphQLType注解或schema自动匹配实现)
  • 若使用代码优先方式定义GraphQL类型,可通过@GraphQLUnion注解声明Union类型,更灵活地控制类型映射

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 17:02:38