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

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

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

废话不说了,进入在正题

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

User.java

  1. public class User {
  2. private int age;
  3. private long id;
  4. private String name;
  5. private Card card;
  6.  
  7. public User(int age, long id, String name, Card card) {
  8. this.age = age;
  9. this.id = id;
  10. this.name = name;
  11. this.card = card;
  12. }
  13.  
  14. public Card getCard() {
  15. return card;
  16. }
  17.  
  18. public void setCard(Card card) {
  19. this.card = card;
  20. }
  21.  
  22. public User(int age, long id, String name) {
  23. this.age = age;
  24. this.id = id;
  25. this.name = name;
  26. }
  27.  
  28. public int getAge() {
  29. return age;
  30. }
  31.  
  32. public void setAge(int age) {
  33. this.age = age;
  34. }
  35.  
  36. public long getId() {
  37. return id;
  38. }
  39.  
  40. public void setId(long id) {
  41. this.id = id;
  42. }
  43.  
  44. public String getName() {
  45. return name;
  46. }
  47.  
  48. public void setName(String name) {
  49. this.name = name;
  50. }
  51. }

Card.java

  1. public class Card {
  2. private String cardNumber;
  3. private Long userId;
  4.  
  5. public Card(String cardNumber, Long userId) {
  6. this.cardNumber = cardNumber;
  7. this.userId = userId;
  8. }
  9.  
  10. public String getCardNumber() {
  11. return cardNumber;
  12. }
  13.  
  14. public void setCardNumber(String cardNumber) {
  15. this.cardNumber = cardNumber;
  16. }
  17.  
  18. public Long getUserId() {
  19. return userId;
  20. }
  21.  
  22. public void setUserId(Long userId) {
  23. this.userId = userId;
  24. }
  25. }

user.graphqls

  1. #对应的User定义如下
  2. schema { #定义查询
  3. query: UserQuery
  4. }
  5. type UserQuery { #定义查询类型
  6. user(id:Long) : User #指定对象以及参数类型
  7. }
  8. type User { #定义对象
  9. id: Long! #!表示非空
  10. name:String
  11. age:Int
  12. card:Card
  13. }
  14.  
  15. type Card {
  16. cardNumber:String
  17. userId:Long
  18. }

demo

  1. import clc.bean.Card;
  2. import clc.bean.User;
  3. import graphql.ExecutionResult;
  4. import graphql.GraphQL;
  5. import graphql.schema.GraphQLSchema;
  6. import graphql.schema.idl.RuntimeWiring;
  7. import graphql.schema.idl.SchemaGenerator;
  8. import graphql.schema.idl.SchemaParser;
  9. import graphql.schema.idl.TypeDefinitionRegistry;
  10. import org.apache.commons.io.IOUtils;
  11.  
  12. /**
  13. * ClassName: GraphQLSDLDemo<br/>
  14. * Description: <br/>
  15. * date: 2019/6/28 11:19 AM<br/>
  16. *
  17. * @author chengluchao
  18. * @since JDK 1.8
  19. */
  20.  
  21. public class GraphQLSDLDemo2 {
  22. public static void main(String[] args) throws Exception {
  23. //读取graphqls文件
  24. String fileName = "user.graphqls";
  25. String fileContent = IOUtils.toString(GraphQLSDLDemo2.class.getClassLoader().getResource(fileName), "UTF-8");
  26. //解析文件
  27. TypeDefinitionRegistry typeDefinitionRegistry = new SchemaParser().parse(fileContent);
  28.  
  29. RuntimeWiring wiring = RuntimeWiring.newRuntimeWiring()
  30. .type("UserQuery", builder ->
  31. builder.dataFetcher("user", environment -> {
  32. Long id = environment.getArgument("id");
  33. Card card = new Card("123456", id);
  34. return new User(18, id, "user0" + id, card);
  35. })
  36. )
  37. .build();
  38.  
  39. GraphQLSchema graphQLSchema = new SchemaGenerator().makeExecutableSchema(typeDefinitionRegistry, wiring);
  40.  
  41. GraphQL graphQL = GraphQL.newGraphQL(graphQLSchema).build();
  42.  
  43. String query = "{user(id:15){id,name,age,card{cardNumber,userId}}}";
  44. ExecutionResult result = graphQL.execute(query);
  45.  
  46. System.out.println("query: " + query);
  47. System.out.println(result.toSpecification());
  48. }
  49. }

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

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

java 使用GraphQL-关联对象的更多相关文章

  1. Java类锁和对象锁实践和内部私有锁关联

    Java类锁和对象锁实践 感谢[jiehao]同学的投稿,投稿可将文章发送到tengfei@ifeve.com 类锁和对象锁是否会冲突?对象锁和私有锁是否会冲突?通过实例来进行说明. 一.相关约定 为 ...

  2. Java GC机制和对象Finalize方法的一点总结

    GC是垃圾收集的意思(Garbage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超 ...

  3. Mybatis之ResultMap一个简短的引论,关联对象

    基础部分能够查看我的还有一篇博客http://blog.csdn.net/elim168/article/details/40622491 MyBatis中在查询进行select映射的时候.返回类型能 ...

  4. Oracle03——游标、异常、存储过程、存储函数、触发器和Java代码访问Oracle对象

    作者: kent鹏 转载请注明出处: http://www.cnblogs.com/xieyupeng/p/7476717.html 1.游标(光标)Cursor 在写java程序中有集合的概念,那么 ...

  5. java处理json与对象的转化 递归

    整个类是一个case,总结了我在使用java处理json的时候遇到的问题,还有级联关系的对象如何遍历,json和对象之间的转换! 对于对象json转换中遇到的问题我参考了一篇博客,http://blo ...

  6. MyBatis之ResultMap简介,关联对象

    MyBatis中在查询进行select映射的时候,返回类型可以用resultType,也可以用resultMap,resultType是直接表示返回类型的,而resultMap则是对外部ResultM ...

  7. Java基础 -- 深入理解Java类型信息(Class对象)与反射机制

    一 RTTI概念 认识Claa对象之前,先来了解一个概念,RTTI(Run-Time Type Identification)运行时类型识别,对于这个词一直是 C++ 中的概念,至于Java中出现RT ...

  8. 【Java并发.4】对象的组合

    到目前为止,我们已经介绍了关于线程安全与同步的一些基础知识.然而,我们并不希望对每一系内存访问都进行分析以确保程序是线程安全的,而是希望将一些现有的线程安全组件组合为更大规模的组件或程序. 4.1 设 ...

  9. Java开发各层对象专用名词含义 PO,VO,DAO,BO,DTO,POJO, BYO,Entity,JavaBean,JavaBeans

    Java的几种名词(PO,VO,DAO,BO,POJO)解释 PO:persistant object 持久对象.可以看成是与数据库中的表相映射的java对象.最简单的PO就是对应数据库中某个表中的一 ...

  10. Mybatis 关联对象不能输出的解决办法

    Mybatis 关联对象不能输出的解决办法 1.如图所示,现在进行查询的时候并没有得到来自另一张表address项 2.我们进行如下配置: (1).在mybatis-config.xml 文件中配置, ...

随机推荐

  1. IE安全限制

    在安全级别下面设置置进行如下调整: A.ActiveX控件自动提示:启用 B.对标记为可安全执行脚本的ActiveX控件执行脚本:启用 C.对未标记为可安全执行脚本的ActiveX控件初始化并执行脚本 ...

  2. Linux在线安装Redis

    一.进入Redis官网寻找需要下载的版本:https://redis.io/ 将下载地址链接复制下来:http://download.redis.io/releases/redis-5.0.7.tar ...

  3. fastJson反序列化参数为null的问题

    fastJson反序列化为类对象时,反序列化赋值的属性只会是你构造器上写的属性. 所以部分属性值为null的原因是属性没有加在构造器上的原因. 直接加个无参数的默认构造器即可解决.或者把null属性加 ...

  4. CMU Database Systems - MVCC

    MVCC是一种用空间来换取更高的并发度的技术 对同一个对象不去update,而且记录下每一次的不同版本的值 存在不会消失,新值并不能抹杀原先的存在 所以update操作并不是对世界的真实反映,这是一种 ...

  5. git : error occurred during unpacking on the remote end: unpack-objects abnormal exit

    error occurred during unpacking on the remote end: unpack-objects abnormal exit git服务器磁盘满了.

  6. USB安装ESXi出错,menu.c32 not a com32r image

    USB安装EXSi出错,menu.c32 not a com32r image 不能进入安装界面. 提供提取的menu.c32 下载下来覆盖U盘根目录源文件 EXSi6.7测试可以用 文件csdn下载 ...

  7. SQL中左连接on and条件和where条件执行先后顺序

    left join :左连接,返回左表中所有的记录以及右表中连接字段相等的记录. right join :右连接,返回右表中所有的记录以及左表中连接字段相等的记录. inner join: 内连接,又 ...

  8. elementUI-tree组件 懒加载

    <el-tree ref="tree" :data="menu.treeData" :props="menu.defaultProps" ...

  9. 成为真正的win10 超级管理员,解决win+r 不以管理员身份运行

    secpol.msc 本地策略=>安全选项 禁用 用户账户控制:以管理员批准模式运行所有管理员 用户帐户控制:用于内置管理员帐户的管理员批准模式 注意:需要重启计算机

  10. mybatis自动生成后无法获取主键id问题

    使用mybatis的自动生成工具生成的主键id: <selectKey resultType="java.lang.Integer" keyProperty="id ...