2015-02-10 3 views
3

Spring Data позволяет объявлять такие методы, как findByLastname() в вашем интерфейсе репозитория, и автоматически генерирует запросы из имени метода.Сочетание конструктора запросов данных Spring с параметрами Spring Data JPA?

Возможно ли, чтобы эти автоматически сгенерированные запросы также принимали Спецификацию, так что могут быть сделаны дополнительные ограничения на данные до их возврата?

Таким образом, я мог бы, например, вызвать findByLastname («Ted», isGovernmentWorker()), который найдет всех пользователей, имеющих фамилию Ted AND, которые удовлетворяют спецификации isGovernmentWorker().

Мне нужно это, потому что я хотел бы, чтобы автоматическое создание запросов предоставлялось Spring Data и, потому что мне все еще нужно иметь возможность применять произвольные спецификации во время выполнения.

ответ

4

Нет такой функции. Технические характеристики могут применяться только к операциям JpaSpecificationExecutor.

Обновление Операции доступа к данным генерируются прокси-сервером. Таким образом, если мы хотим группировать операции (как в findByName + Criteria) в одном вызове SELECT, прокси должен понимать и поддерживать этот вид использования; которого нет.

Предполагаемое использование, при использовании спецификации API будет выглядеть для вашего случая:

findAll(Specifications.where(hasLastName("Ted")).and(isGovernmentWorker()) 
+0

Справа. Но есть ли способ каким-то образом имитировать одно и то же? Например, вы можете создать обертку вокруг findAll (Спецификация s) для имитации findOne (Спецификация s). –

+0

См. Обновленный ответ. –

+0

Маниш - спасибо. Да, работа над полнофункциональными спецификациями определенно работает - я просто надеялся, что я также смогу использовать функцию построителя запросов Spring Data. Опять же, спасибо! –

0

Данные Spring позволяют реализовать пользовательский репозиторий и использовать спецификации или QueryDSL.

См. Статью this.

Итак, у вас будет один YourCustomerRepository и соответствующий YourRepositoryImpl, где вы поместите свой метод findByLastname("Ted", isGovernmentWorker()). И затем YourRepository должен расширять интерфейс YourCustomerRepository.

+0

Это не ответ на мой вопрос. QueryDSL - это просто синтаксический сахар. Я хочу иметь возможность запускать запрос, например findByLastname («Тед», isGovernmentWorker()). Можете ли вы показать мне, какой синтаксис мне нужно использовать. Я не думаю, что есть такое решение. –

Смежные вопросы