Обикновено се реализират приложения за управление на данни, в които е необходимо да се съхраняват, редактират и изтриват данни. За тях е необходимо да внедрите CRUD операции (Create, Read, Update, Delete) за отделните обекти. Вместо да разписвате едни и същи CRUD операции отново и отново, Spring Data предоставя различни абстракции като CrudRepository, PagingAndSortingRepository и JpaRepository. Те предоставят готова поддръжка за CRUD операции, страниране и сортиране.
Необходио е да създадем интерфейс, разширяващ JpaRepository:
· Първо, чрез разширяване на JpaRepository ние получаваме набор от общи CRUD методи за нашия тип, който позволява запазване на градове, изтриването им и т.н., без да се налага да разписваме тяхната имплементация
· Второ, с помощта на инфраструктурата на хранилището на Spring Data JPA този интерфейс автоматично ще бъде сканиран.
Някои предоставяни общи методи:
//Съхранява в БД подадения обект<S extends T>Ssave(S entity);//Връща обекта по подаден idOptional<T>findById(ID id);//Връща всички обекти от дадения типList<T>findAll();//Изтрива зададения обектvoiddelete(T entity);
Посочените методи се достъпват директно в обслужващия слой:
Query методи
Query методите са мощен инструмент за взаимодействие със записите от базата от данни, без да се налага да пишем SQL заявки. Зад кулисите, въз основа на метода на заявката, Spring Data JPA ще създаде SQL заявка и ще я изпълни вместо нас. Извиканата заявка се извлича от името на метода.
Пример:
Spring Data JPA превежда името на метода в следната JPQL заявка:
select u from User u where u.emailAddress = ?1 and u.lastname = ?2
Правила за създаване на Query методи
Името да метода трябва да започва с един от посочените префикси: find…By, read…By, query…By, count…By, get…By и др. Примери: findByName, readByName, queryByName, getByName
Ако искаме да ограничим броя на върнатите резултати, можем да добавим ключовите думи First или Top преди By. Примери: findFirstByName, readFirst2ByName, findTop10ByName
Ако искаме да изберем уникални резултати, добавяме ключова дума Distinct преди By. Примери: findDistinctByName или findNameDistinctBy
Комбинирайте изрази с AND или OR. Примери: findByNameOrDescription, findByNameAndDescription
Използвайки Query методите при по-сложни заявки, можем да достигнем ситуация, при която методът ни да има следния вид: findAllByPostAndStatusAndReviewLikeAndVotesGreaterThanEqualOrderByCreatedOn
Освен объркващия външен вид, подадена по този начин заявката ще бъде по-бавна за изпълнение. За разрешаване на този проблем можем да използваме анотацията @Query.
@Query("SELECT t FROM Tutorial t")
List<Tutorial> findAll();
@Query("SELECT u FROM User u WHERE u.emailAddress = ?1")
User findByEmailAddress(String emailAddress);
@Query("SELECT * FROM tutorials t WHERE t.title LIKE %?1%")
List<Tutorial> findByTitleAndSort(String title, Sort sort);
@Query("SELECT MAX(eventId) AS eventId FROM Event")
Long lastProcessedEvent();
@Query("SELECT t FROM Tutorial t
WHERE t.published=:isPublished AND t.level BETWEEN :start AND :end")
List<Tutorial> findByLevelBetween(
@Param("start") int start,
@Param("end") int end,
@Param("isPublished") boolean isPublished
);