Это в рамках обработки одного запроса? тогда всё понятно, никакое кэширование здесь ни при чём.
Вы в конструкторе создаёте билдер запросов:
$this->exist = $this->createQueryBuilder('i')
То есть, в памяти хранится объект билдера, и в дальнейшем вы обращаетесь несколько раз к этому объекту, который уже имеет своё состояние.
У вас два подхода:
1) в каждом методе создавать новый билдер и указывать им нужные общие параметры. Чтобы не дублировать код, можно сделать приватный метод getBuilderExist(), который будет создавать объект билдера и задавать базовые настройки запроса.
2) либо в методах, использующих уже существующий билдер, клонировать его и использовать копию:
public function findByCategory($category)
{
$qb = clone($this->exist);
return $qb
->andWhere('i.category = :category')
->setParameter('category', $category)
->getQuery()->getResult();
}
Я бы выбрал первый подход, чтобы не добавлять классу лишнее состояние.