Я пытаюсь найти хороший и элегантный способ запроса содержимого базы данных на основе «спецификаций» DDD.перевод спецификации в предикаты запроса
В доменном дизайне спецификация используется для проверки того, совместим ли какой-либо объект, также известный как кандидат, с требованием (для конкретного домена). Например, спецификация «IsTaskDone» идет как:
class IsTaskDone extends Specification<Task> {
boolean isSatisfiedBy(Task candidate) {
return candidate.isDone();
}
}
Приведенное выше описание может быть использована для многих целей, например, его можно использовать для проверки выполнения задачи или для фильтрации всех завершенных задач из коллекции. Тем не менее, я хочу повторно использовать эту, красивую, связанную с доменом спецификацию для запроса в базе данных.
Конечно, самым простым решением было бы получить все объекты требуемого типа из базы данных и отфильтровать этот список в памяти путем объединения и удаления несовпадающих объектов. Но ясно, что это не было бы оптимальным для производительности, особенно когда число лиц в нашем db увеличивается.
Предложение
Так что моя идея заключается в том, чтобы создать «ConversionManager», который транслирует свою спецификацию в технике, сохранения определенных критерии, подумайте класс предикатов JPA. Услуги выглядят следующим образом:
public interface JpaSpecificationConversionManager {
<T> Predicate getPredicateFor(Specification<T> specification, Root<T> root, CriteriaQuery<?> cq, CriteriaBuilder cb);
JpaSpecificationConversionManager registerConverter(JpaSpecificationConverter<?, ?> converter);
}
Используя наш менеджер, пользователи могут зарегистрировать свою собственную логику преобразования, изолируя спецификацию домена, связанные с настойчивостью определенной логики. Чтобы свести к минимуму конфигурацию нашего менеджера, я хочу использовать аннотации для своих классов конвертеров, позволяя менеджеру автоматически регистрировать эти конвертеры.
Реализации хранилища JPA могут затем использовать моего менеджера через инъекцию зависимостей, чтобы предложить метод поиска по методу спецификации. Предоставление поиска по спецификации должно значительно сократить количество методов в нашем интерфейсе репозитория.
Теоретически это звучит прилично, но я чувствую, что мне не хватает чего-то критического. Что вы, ребята, думаете о моем предложении, соответствует ли он методу DDD? Или есть уже структура, которая делает что-то идентичное тому, что я только что описал?
И люди задаются вопросом, почему Java получает плохую упаковку за то, что она слишком переделана ... – GreenieMeanie
И как вы справляетесь с ситуацией, когда у вас есть соединение (логическое И) спецификаций? Как вы переводите соединение спецификаций в запрос? – dzieciou