Netflix DGS - Подключение сгенерированного сопоставления внешнего ключа класса
Я использую Netflix DGS для подключения своих сборщиков и загрузчиков данных. До сих пор я использовал свои собственные классы сущностей с загрузчиками, и все работает нормально.
Отношение
Классы сущностей
Моя связь сущностей - один-к-N, как на диаграмме выше. Моя сущность выглядит так. Это прямое отображение моей таблицы 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. И он изящно решил N + 1, и вложенный объект никогда не трогается, если при выборе не упоминается поле учетной записи.
Сборщик и загрузчик
@DgsData(parentType = "Query", field = "expenses")
fun expenses(): List<Expense> {
return expenseRepository.findAll().toList()
}
Сборщик возвращает список объектов расходов. GraphQL использует приведенные ниже отношения, определенные в Сборщике учетных записей, для получения учетной записи с помощью загрузчика.
`@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
}
Codegen
Позже я решил использовать кодогенерацию DGS для создания моделей для меня. Сгенерированный
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.
Я что-нибудь упускаю?
Как я могу использовать генерацию кода и загрузчики?