Я изо всех сил пытаюсь понять, как лучше всего запросить репозиторий.
Три фактора, которые прямо сейчас бросают меня в тупик:
- Тип возвращаемых данных
- Столбцы для выполнения запроса
- Количество возвращаемых записей
Пункт 1
Что касается вопроса один:
У меня есть репозитории с множеством методов, которые возвращают комбинацию как сущностей, так и скалярных значений. Кажется, это приводит к «взрыву метода». Должен ли я всегда возвращать объект Entity? Как мне запрашивать объекты, где мне нужен только один столбец?
Пункт 2 Должен ли я при выполнении запроса включать каждый столбец в таблицу, даже если мне нужен только один или два столбца? Если я создам для этого специальные запросы, это приведет к увеличению количества методов в репозитории.
Точка 3 Как предоставить условия для запроса? Я читал о спецификациях, но, насколько я понимаю, вы перебираете возвращенные записи и отфильтровываете те, которые переходят в новую коллекцию. Это не похоже на хорошую идею с точки зрения производительности. Прямо сейчас я просто создаю новый метод в репо, например getNameById(), который инкапсулирует условие.
Обратите внимание, что я не использую ORM, у меня просто есть необработанный sql в моих репозиториях.
Обновить
Пункт 1. Основываясь на ответах и небольшом количестве дополнительных исследований, будет ли это хорошей реализацией?
Прямо сейчас у меня есть большой репозиторий, который возвращает смесь объектов скалярного и сущностного типов (все они одинаковые). Я думаю, что мог бы значительно уменьшить это, если бы просто использовал метод GetUser(userId) и забыл о написании методов, которые просто возвращают значения одного столбца.
Например, если мне нужно вернуть имя пользователя, я мог бы вызвать метод GetUser(userId), который гидратирует объект пользователя, а затем на уровне сервиса просто отфильтровать его до имени пользователя.
Другой способ - использовать какой-то класс QueryBuilder, который я мог бы передать в репозиторий, который можно было бы проанализировать для создания правильного sql.
Пункт 2
Оглядываясь назад, это очень похоже на первый пункт, и моим текущим решением было бы просто захватить все поля таблицы. Это компромисс между производительностью и ремонтопригодностью.
Точка 3
Мне нужно было бы предоставить какое-то предложение where. Я не уверен, имеет ли смысл делать это через спецификацию или просто через строку sql. Мое текущее решение состоит в том, чтобы создать новые методы для этих типов, но я хотел бы что-то более общее для репозитория.
В целом, все еще изучаю это... Я хотел бы услышать больше информации об этом или ссылок на книги или ссылки, которые связывают все это воедино.