我正在使用 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 时缺乏使用加载器的能力。
我错过了什么吗?
如何使用代码生成和加载器?