Odpowiedź: Najlepiej korzystać ze wszystkich, ale każdy nadaje się lepiej do czego innego. Przedstawiam listę w kolejności użytkowania wg. mnie najlepszej. Przechodzisz przez kolejne punkty - jeżeli czegoś nie da się pobrać przez $this->find idziesz do query buildera, jak czegoś nie znajdziesz w query builderze - idziesz do dqla. Jednak wszystkie te operacje najlepiej wykonywać w repozytorium (no może poza ->find)
Pobiera usera po id - przypadek najprostrzy:
$user = $em->find("User", $id);
Query builder jest dużo częściej wykorzystywany do zapytań niż dql - łatwiejszy i czytelniejszy. Łatwo jest w nim joinować budując skomplikowane obiekty
$qb = $em->createQueryBuilder();
$qb->select('u')->from('User', 'u')
Do trudniejszych zapytań z joinami - tak na prawdę powinno się to znajdować w repozytorium, a na pewno nie w kontrolerze:
$user = $em->createQuery($dql)->getResult()
Repozytorium jest do przechowywania metod pobierania i pracy na danych z bazy. Najlepiej jest tam dorzucić metody pobierające użytkowników wg konkretnych warunków, w innych repozytoriach pobierasz z tego np. artykuły dla użytkownika z tagami (przez zdeklarowane przez siebei metody)
$user_r = $em->getRepository('User')