GraphQL并不会实现关联查询,数据关联需要程序自己实现

官网首页有介绍获取多个资源只需要一个请求,如想获取用户信息和身份证信息,原来需要先查用户信息,再通过用户id查询身份证信息,而在GraphQL中一次请求就可以实现。

对于这个观点我不敢苟同,可能我还没有体会到这种感觉,我认为只要需求明确,多个资源一次请求在RESTFUl中同样可以实现。

废话不说了,进入在正题

  之前已经实现了对user对象的查询操作,现在对user添加一个card属性,操作user对象时可以关联到card信息

User.java

public class User {
private int age;
private long id;
private String name;
private Card card; public User(int age, long id, String name, Card card) {
this.age = age;
this.id = id;
this.name = name;
this.card = card;
} public Card getCard() {
return card;
} public void setCard(Card card) {
this.card = card;
} public User(int age, long id, String name) {
this.age = age;
this.id = id;
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} public long getId() {
return id;
} public void setId(long id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
}
}

Card.java

public class Card {
private String cardNumber;
private Long userId; public Card(String cardNumber, Long userId) {
this.cardNumber = cardNumber;
this.userId = userId;
} public String getCardNumber() {
return cardNumber;
} public void setCardNumber(String cardNumber) {
this.cardNumber = cardNumber;
} public Long getUserId() {
return userId;
} public void setUserId(Long userId) {
this.userId = userId;
}
}

user.graphqls

#对应的User定义如下
schema { #定义查询
query: UserQuery
}
type UserQuery { #定义查询类型
user(id:Long) : User #指定对象以及参数类型
}
type User { #定义对象
id: Long! #!表示非空
name:String
age:Int
card:Card
} type Card {
cardNumber:String
userId:Long
}

demo

import clc.bean.Card;
import clc.bean.User;
import graphql.ExecutionResult;
import graphql.GraphQL;
import graphql.schema.GraphQLSchema;
import graphql.schema.idl.RuntimeWiring;
import graphql.schema.idl.SchemaGenerator;
import graphql.schema.idl.SchemaParser;
import graphql.schema.idl.TypeDefinitionRegistry;
import org.apache.commons.io.IOUtils; /**
* ClassName: GraphQLSDLDemo<br/>
* Description: <br/>
* date: 2019/6/28 11:19 AM<br/>
*
* @author chengluchao
* @since JDK 1.8
*/ public class GraphQLSDLDemo2 {
public static void main(String[] args) throws Exception {
//读取graphqls文件
String fileName = "user.graphqls";
String fileContent = IOUtils.toString(GraphQLSDLDemo2.class.getClassLoader().getResource(fileName), "UTF-8");
//解析文件
TypeDefinitionRegistry typeDefinitionRegistry = new SchemaParser().parse(fileContent); RuntimeWiring wiring = RuntimeWiring.newRuntimeWiring()
.type("UserQuery", builder ->
builder.dataFetcher("user", environment -> {
Long id = environment.getArgument("id");
Card card = new Card("123456", id);
return new User(18, id, "user0" + id, card);
})
)
.build(); GraphQLSchema graphQLSchema = new SchemaGenerator().makeExecutableSchema(typeDefinitionRegistry, wiring); GraphQL graphQL = GraphQL.newGraphQL(graphQLSchema).build(); String query = "{user(id:15){id,name,age,card{cardNumber,userId}}}";
ExecutionResult result = graphQL.execute(query); System.out.println("query: " + query);
System.out.println(result.toSpecification());
}
}

query: {user(id:15){id,name,age,card{cardNumber,userId}}}
{data={user={id=15, name=user015, age=18, card={cardNumber=123456, userId=15}}}}

再次强调,关联信息是程序控制的,并不是GraphQL

最新文章

  1. redis成长之路——(七)
  2. Winform调用百度地图接口
  3. Tomcat数据库连接池的配置方法总结
  4. 如何使用IAR仿真环境查看CPU类型字长?
  5. Html5的&lt;button&gt;标签
  6. deflate树与deflate编码
  7. rowid结构浅析
  8. 用内存流 文件流 资源生成客户端(Delphi开源)
  9. bzoj 1179: [Apio2009]Atm
  10. Android 入门(2)修改EditText下划线颜色 / 隐藏标题栏
  11. JAVA中几种常用的RPC框架介绍
  12. 每周分享之JS数组的使用
  13. js基础梳理-究竟什么是执行上下文栈(执行栈),执行上下文(可执行代码)?
  14. 基于Mybatis实现一个查库的接口
  15. Go Example--通道方向
  16. 基于.NET平台常用的框架整理 【转载】
  17. hdu 4704 Sum 【费马小定理】
  18. 边框画的三角形给shadow
  19. typedef和define一些问题
  20. Tensorflow 之 name/variable_scope 变量管理

热门文章

  1. 【2019】Charles视频教程,接口测试工具最新教程
  2. semantic ui要装什么才能使用
  3. ngxtop安装和使用
  4. java excel给单元格增加批注(包含SXSSF)
  5. matlab学习笔记8 基本绘图命令-LineSpec线条设定
  6. 【翻译】Flink Table Api &amp; SQL — Hive Beta
  7. EasyRTMP推送扩展支持HEVC(H265) RTMP推送之Metadata结构填写详解
  8. Java程序运行机制
  9. Numba——python面向数组高性能计算库
  10. AppCrawler安装使用