2

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

关系

图像

实体类

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

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 时缺乏使用加载器的能力。

我错过了什么吗?

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

4

0 回答 0