Netflix DGS - Подключение сгенерированного сопоставления внешнего ключа класса

Я использую Netflix DGS для подключения своих сборщиков и загрузчиков данных. До сих пор я использовал свои собственные классы сущностей с загрузчиками, и все работает нормально.

Отношение

img

Классы сущностей

Моя связь сущностей - один-к-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.

Я что-нибудь упускаю?

Как я могу использовать генерацию кода и загрузчики?

0 ответов

Другие вопросы по тегам