Spring Boot/Spring Data JPAで使用できるJPQLの機能を整理してみました。
主にこちらの記事を参考にさせていただきました。有難うございました。
Spring Data JPAによるデータアクセス徹底入門 #jsug
■一般的なJPQLではEntityManagerを使います。
//JPQL オリジナルの使用方法
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.TypedQuery;
EntityManagerFactory emf;
EntityManager em;
em = emf.createEntityManager();
TypedQuery<Product> query = em.createQuery(
"SELECT p FROM Product p WHERE p.id <= :maxId ORDER BY p.id", Product.class);
query.setParameter("maxId", 5);
List<Product> productList = query.getResultList();
■Spring Data JPAでは支援機能のおかげでEntityManagerは不要です。
※JpaRepositoryを継承することで下記の支援機能が使用できます。
<1>JpaRepositoryに既に定義されているメソッド群がそのまま使用できます。
findById(id), findAll(pageable), save(entity), delete(entity)等
<2>@Query,@Modifyingアノテーション
・Repositoryインターフェースにメソッドを作成。@Queryアノテーションを付加してJPQLを記述すれば、EntityManagerは不要です。
・nativeQuery=trueとすればネイティブSQLも書けます。
・@Queryで更新系クエリーを使う場合は、@Modifyingが必要です。
<3>命名規約に従ってメソッド名を記述すれば@QueryでJPQLを記述する必要はありません。
<4>Date and Time API (JSR 310)対応
Jsr310JpaConverterクラス:LocalDateなどのAttributeConverterが提供されています。
@Query("SELECT p FROM Product p WHERE p.id <= :maxId ORDER BY p.id")
List<Product> findByMaxIdOrderById(@Param("maxId")Integer maxId)
// 命名規約に従ったメソッド名(@QueryでJPQLを記述する必要なし)
// Product.nameに引数の文字列が含まれているものを検索する。
List<Product> findByNameContaining(String keyword);
<3-補足> メソッド名に使えるキーワード例
And, Or, Between, LessThan, LessThanEqual, Like, StartWith, EndWith, Containing, OrderBy, ...
詳細はこちらを参照「Spring Data JPA - Reference Documentation/ 5.3.2. Query Creation」
■(参考)Spring Data JPA 公式ドキュメント
Spring Data JPA - Reference Documentation
■(参考)TERASOLUNA Server Framework for Java (5.x) Development Guideline
6.3. データベースアクセス(JPA編)
■(参考)JPA実装ライブラリ
Hibernate : Spring Data JPAは基本的にこれを使用。
※JPAの参照実装であるEclipseLinkではありません。
※ライブラリ "org.springframework.boot/spring-boot-starter-data-jpa"
__(参考)JPAのVersionとJSR(Java Specification Request)__
-
JPA 2.0 (JSR 317) - This version was released in the last of 2009. Following are the important features of this version: -
It supports validation
It expands the functionality of object-relational mapping
It shares the object of cache support -
JPA 2.1 (JSR 338) - The JPA 2.1 was released in 2013 with the following features: -
It allows the fetching of objects
It provides support for criteria update/delete
It generates a schema -
JPA 2.2 (JSR 338) - The JPA 2.2 was released in 2017. Some of its important features are: -
It supports Java 8 Date and Time
It provides @Repeatable annotation that can be used when we want to apply the same annotations to a declaration or type use
It allows JPA annotation to be used in meta-annotations
It provides an ability to stream a query result