问题描述
我正在使用 Netflix DGS 连接我的数据提取器和加载器。到目前为止,我一直在使用自己的实体类和加载器,一切正常。
关系
实体类
我的实体关系如上图所示是一对 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 (将#修改为@)