Netflix DGS - 连接生成的类外键映射 关系实体类提取器和加载器架构代码生成器

问题描述

我正在使用 Netflix DGS 连接我的数据提取器和加载器。到目前为止,我一直在使用自己的实体类和加载器,一切正常。

关系

img

实体类

我的实体关系如上图所示是一对 N 关系。我的 Expense 实体看起来像这样。这是我的db表的直接映射。

data class Expense(
   val id: Int? = 0,val amount: Int? = null,val remarks: String? = null,val isIncome: Boolean? = false,val acNumber: Int? = 0
)

因此,当我尝试在 graphql 模式中获取帐户信息时,我使用加载器并将 acNumber 字段提供给它。 And it solved the N+1 gracefully and the nested object is never touched when selection doesn't mention account field.

提取器和加载器

@DgsData(parentType = "Query",field = "expenses")
fun expenses(): List<Expense> {
   return expenseRepository.findAll().toList()
}

Fetcher 返回费用实体列表。 GraphQL 利用 Account Fetcher 中定义的以下关系来使用加载器获取 Account。

`@DgsData(parentType = "Expense",field = "account")
fun getAccounts(dfe: DgsDataFetchingEnvironment): CompletableFuture<Account> {
   val DataLoader: DataLoader<Int,Account> =
        dfe.getDataLoader(AccountsDataLoader::class.java)
   val source = dfe.getSource<Expense>()
   val acNumber = source.acNumber
   return DataLoader.load(acNumber)
}

架构

type Expense {
    id: ID
    remarks: String
    amount: Int
    isIncome: Boolean
    account: Account
}

type Account {
    acNumber: ID,nickName: String,balance: Int
}

代码生成

后来我决定使用 DGS codegen 为我创建模型。生成Expense 类如下所示。

public data class Expense(
  `@JsonProperty("id")
  public val id: String? = null,`@JsonProperty("remarks")
  public val remarks: String? = null,`@JsonProperty("amount")
  public val amount: Int? = null,`@JsonProperty("isIncome")
  public val isIncome: Boolean? = null,`@JsonProperty("account")
  public val account: Account? = null. <--- account object itself present here
) 

由于生成的类中没有 acNumber 字段,所以我在使用 code-gen 时缺乏使用加载器的能力。

我错过了什么吗?

如何使用代码生成和加载器?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)