Nestjs и TypeORM: нет результатов от построителя запросов с использованием getOne() / getMany()

#node.js #nestjs #typeorm

#node.js #nestjs #typeorm

Вопрос:

Я этого не понимаю. У меня есть служба, которая внедряет репозитории сущностей и имеет специальные методы для выполнения некоторой бизнес-логики и функций.

Кроме того, я предоставляю метод, который просто возвращает QueryBuilder — чтобы избежать повсеместного внедрения репозиториев — в нескольких случаях, когда другой службе требуется просто быстрый запрос:

 type EntityFields = keyof MyEntity;

entityQueryBuilder(alias?: string, id?: number, ...select: EntityFields[]) {
  const q = this.entityRepository.createQueryBuilder(alias);
  if (id) {
    q.where({id});
  }
  if (select) {
    q.select(select);
  }
  return q;
}
  

Теперь, когда я пытаюсь использовать это и вызываю:

 const r = await service.entityQueryBuilder('a', 1, 'settings').getOne();
  

результат всегда пустой, хотя в журнале сгенерированный SQL правильный.

Однако, когда я делаю:

 const r = await service.entityQueryBuilder('a', 1, 'settings').execute();
  

Я получаю (почти) то, что мне нужно. Я получаю массив вместо объекта entity напрямую, но данные есть.

Я недоволен, поскольку мне нужно сопоставить результат с объектом, который я хотел, что getOne() должно быть сделано от моего имени. getMany() также не возвращает результатов.

Что я сделал не так?

Редактировать:

FWIW вот окончательное решение, которое я придумал на основе подсказки в принятом ответе:

 entityQueryBuilder(id?: number, ...select: EntityFields[]) {
  const q = this.entityRepository.createQueryBuilder('alias');
  if (id) {
    q.where({id});
  }
  if (select) {
    q.select(select.map(f => `alias.${f}`));
  }
  return q;
}

  

По общему признанию, он жестко alias запрограммирован, но с этим я могу смириться и подходит для моей цели.

Надеюсь, это поможет кому-то в будущем.

Ответ №1:

Это происходит потому, что вы не указали действительно правильный выбор. В вашем случае вам нужно a.settings вместо settings :

 const r = await service.entityQueryBuilder('a', 1, 'a.settings').getOne(); // it should works