Введение
Spring Data позволяет легче создавать Spring-управляемые приложения которые используют новые способы доступа к данным, например нереляционные базы данных, map-reduce фреймворки, cloud сервисы, а так же уже хорошо улучшенную поддердку реляционных баз данных.
В этой статье будет рассмотрен один из под-проектов Spring Data — JPA
Что может Spring Data — JPA
- Создание и поддержка репозиториев созданных при помощи Spring и JPA
- Поддержка QueryDSL и JPA запросов
- Аудит доменных классов
- Поддержка порционной загрузки, сортировки, динамимических запросов
- Поддержка XML мэппинга для сущностей
Для чего вам может понадобиться Spring Data — JPA
Я бы ответил так — если вам нужно быстро в проекте создать Repository слой базируемый на JPA, предназначенный в основном для CRUD операций, и вы не хотите создавать абстрактные дао, интерфейсы их реализации, то Spring Data — JPA это хороший выбор.
С чего начать
Будем считать у вас уже есть maven проект с подключенным Spring, базой данных, настроенным EntityManager-ом.
1. Добавьте артефакт со Spring Data — JPA
<dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-jpa</artifactId> <version>1.0.2.RELEASE</version> </dependency>
2. В ваш applicationContext.xml нужно добавить путь где будут храниться ваши Repository интерфейсы
<jpa:repositories base-package="com.test.repository" />
3. Создать Entity и Repository интерфейс для него
package com.test.entity; ... @Entity public class Test { @Id @GeneratedValue(strategy = GenerationType.AUTO) @Column(name = "id") private Long id; private boolean dummy; private int tries; ... } package com.test.repository; import org.springframework.data.repository.CrudRepository; import com.test.entity.Test; public interface TestRepository extends CrudRepository<Test, Long> {}
4. Теперь вы можете использовать созданный интерфейс в вашем приложении
public class TestServiceImpl extends TestService { @Autowired TestRepository testRepository; ... }
Наследовавшись от CrudRepository вы получили возможность вызывать такие методы как:
- save
- save
- findOne
- exists
- findAll
- count
- delete
- delete
- delete
- deleteAll
без необходимости реализовывать их имплементацию.
Работа с запросами, сортировкой, порционной загрузкой
Рассмотрим на примере: вам нужно сделать запрос, который выберет все Test записи, у которых поле «dummy» установленно в false, и записи отсортированны по полю «tries» в порядке ABC.
Для решения такой задачи вы можете выбрать один из нескольких вариантов:
Вариант 1:
@Query("FROM Test where dummy = ?1 ORDER BY tries ASC") List<Product> findTests(boolean dummyVal);
, или вариант 2:
List<Test> findByDummyOrderByTriesAsc(boolean dummyVal);
Если с первым способом все предельно просто и это знакомый запрос, то второй способ заключается в том, чтобы составить имя метода, особым способом использую ключевые слова, такие как: «find», «order», имя переменных и тд. Разработчики Spring Data — JPA постарались учесть большинство возможных вариантов, которые могут вам понадобится.
Specification и CriteriaBuilder
Если вам нужно написать действительно сложный запрос для этого вы можете использовать Specification.
Пример в котором в зависимости от «retries» будут выбраны данные с разными значениями «dummy».
public final class TestSpecs { public static Specification<Test> checkRetries(final int retries) { return new Specification<Test>() { @Override public Predicate toPredicate(Root<Test> root, CriteriaQuery<?> query, CriteriaBuilder cb) { if (retries > 10) { return cb.equal(root.get("dummy"), false); } else { return cb.equal(root.get("dummy"), true); } } }; } }
Следующий пример покажет как можно использовать созданный Specification для фильтра всех данных.
Расширим ваш интерфейс при помощи JpaSpecificationExecutor
public interface TestRepository extends CrudRepository<Test, Long>, JpaSpecificationExecutor<Test> {}
и вызовем метод findAll передав ему созданную Specification
public class TestServiceImpl extends TestService { @Autowired TestRepository testRepository; public void doTest() { int retries = 5; List<Test> result = testRepository.findAll(Specifications.where(TestSpecs.checkRetries(retries)) ... } }
Документация
Основной сайт проекта со списком всех Spring Data подпроектов.
Сайт проекта Spring Data — JPA
Техническая документация с примерами всех возможностей
Автор: mais