1

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.

1 Answer 1

3

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 
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.