Весна как повторно использовать спецификацию для отношений

#spring #spring-data-jpa #spring-data

Вопрос:

Для простоты предположим, что у нас есть таблица клиентов и таблица заказов. У клиента может быть несколько заказов.

Теперь я создал isBirthday спецификацию для дня рождения клиентов. С его помощью я подарю всем клиентам, которые сегодня празднуют свой день рождения customerRepository.findAll(hasBirthday());

Теперь я хочу повторно использовать эту спецификацию в ordersReposity.

 ordersRepository.findAll(hasBirthday(), someOrderSpecifiation1(), someOrderSpecifiation2(), ...);  
 

Я не хочу переписывать ту же hasBirthday спецификацию, но теперь с объединением клиентов для таблицы заказов.

Конечно, я могу сделать что-то подобное:

customerRepository.findAll(hasBirthday()).stream().filter(//somelogic); Но это было бы не идеально с более сложной логикой.

Есть ли способ повторно использовать спецификацию?

Ответ №1:

Спецификации Spring Data JPA-это всего лишь простые классы, предоставляющие a Predicate в результате вызова метода.

Вы можете использовать обычные способы OOP для повторного использования кода с ними.

Я рекомендую обычный способ извлечения дублированного кода с помощью базы кода:

Напишите обе реализации с щедрым использованием вырезания и вставки, пока они оба не заработают. Без сомнения, ваши тесты скажут вам, когда вы достигли этой точки.

Затем взгляните на код, который вы получили, чтобы узнать, как извлечь общие части. Шаблон шаблона может быть полезен, если вы извлекаете код, который фактически дает вам ссылку на клиента, к которой вы применяете фактический предикат.