如何用Querydsl实现GraphQL的Spring

282 阅读3分钟

Spring团队提供了一个非常强大但易于创建的设置,它允许创建一个直接从数据库获取数据的API。

本教程是基于一个负责管理客户及其购买交易信息的应用程序。所有数据都驻留在SQL数据库中,该数据库有两个表:customers和purchase_transaction。

该应用是一个Java Spring Boot应用,带有GraphQLJPA,连接到H2数据库。Querydsl将作为连接GraphQL查询和JPA 的 "链接",因为它通过生成元模型来表达查询谓词。而这是通过使用注解处理器来完成的。为了便于测试,我创建了一个用随机值填充数据库 的类。

你可以在下面找到运行这个项目所需的完整代码和依赖性。

GitHub - polovyivan/spring-graphql-repository

1.最低配置的设置

我将首先向你展示如何进行最小配置的设置。首先,我们必须创建一个JPA仓库,返回映射到customerstable的实体。这个存储库必须扩展CrudRepository和QuerydslPredicateExecutor,并以@GraphQlRepository作为注释。

medium.com/media/455be…

下一步是创建一个GraphQL模式文件,该文件中的查询将被直接翻译到这个资源库。

type Query {
type CustomerEntity {

这实际上就是我们要做的全部。这里我映射了2个查询:第一个将返回所有客户的列表,第二个将从数据库 中获取客户,并在查询id中提供。

2.更高级的设置

假设我们有一个API的需求,它应该从purchase_transacions表中获取数据,但这个API不能返回一个确切的实体,而是一个DTO,并且可以限制这个DTO返回的字段。在我们的案例中,一个API不会返回一个字段的数量。

为了实现这些要求,我们可以使用投影。投射提供了一种在返回给API的消费者之前转换查询结果的方法。我们将从PurchaseTransactionEntity返回对象,而不是返回下面的投影。

medium.com/media/10ab8…

和前面的例子一样,我们必须创建一个资源库并在模式文件中描述查询,一个是返回所有购买交易的列表,另一个是按id获取交易。

medium.com/media/fac93…

DataFetcher 从GraphQL请求参数中建立了一个Querydsl Predicate,并使用它来获取数据。

上面的引文来自Spring的官方文档,所以在创建查询时要考虑这个规则。

由于这些查询不会返回实体,而是投影,我们必须为每个API配置一个数据获取器,如下所示。

medium.com/media/5edc7…

配置很简单,包括为每个查询创建数据获取器,然后将其添加到RuntimeWiringConfigurer。

该项目有一个带有Postman 集合的文件夹,所以你可以自己运行它。短短的演示视频向你展示了它是如何工作的。

medium.com/media/ebbba…

总结

本教程是关于一个简单而强大的设置,允许创建直接连接到数据库的GraphQL API,只需最小的努力。另外,我推荐你查看官方文档。谢谢你的阅读!如果你有任何问题或建议,请随时在我的LinkedIn账户上给我写信。


Spring for GraphQL with Querydsl最初发表于Medium上的Javarevisited,在那里人们通过强调和回应这个故事继续对话。