Search code examples
node.jsnestjstypeorm

Nestjs & TypeOrm: No results from Query Builder using getOne() / getMany()


I don't get this. I have a service that injects entity repositories and has dedicated methods to do some business logic and functions.

Beside that I expose a method that just returns QueryBuilder - to avoid injecting repositories all over the place - for a few occasions when other service needs just a quick query:

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;
}

Now when I am trying to use this and call:

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

the result is always empty although in the log the generated SQL is correct.

However when I do:

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

I get (almost) what I need. I get array instead of an entity object directly but the data are there.

I am unhappy though as I need to map the result to the object I wanted, which is something that getOne() should do on my behalf. getMany() does not return results either.

What did I do wrong?

Edit:

FWIW here is the final solution I came up with based on the hint in accepted reply:

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;
}

Admittedly it has hardcoded alias but that I can live with and is OK for my purpose.

Hope this helps someone in the future.


Solution

  • It happens because you put no really proper select. In your case, you need a.settings instead of settings:

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