【Spring Boot】SpringDataJpaは便利だけど使えるJPQLの機能がはっきりしない。…ので、整理しました。

Spring Boot/Spring Data JPAで使用できるJPQLの機能を整理してみました。
主にこちらの記事を参考にさせていただきました。有難うございました。
[Spring Data JPAによるデータアクセス徹底入門 #jsug](https://www.slideshare.net/masatoshitada7/spring-data-jpa-jsug)

__■一般的なJPQLではEntityManagerを使います。__

````JPQL_Original_Use.java
//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が提供されています。

````<2>JPQL_SpringDataJPA_Use.java
@Query("SELECT p FROM Product p WHERE p.id <= :maxId ORDER BY p.id")
List<Product> findByMaxIdOrderById(@Param("maxId")Integer maxId)
````

````<3>JPQL_AutoGenerated.java
// 命名規約に従ったメソッド名（@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」](https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.query-methods.query-creation)

__■（参考）Spring Data JPA 公式ドキュメント__
[Spring Data JPA - Reference Documentation](https://docs.spring.io/spring-data/jpa/docs/current/reference/html)
__■（参考）TERASOLUNA Server Framework for Java (5.x) Development Guideline__
[6.3. データベースアクセス（JPA編）](http://terasolunaorg.github.io/guideline/5.4.1.RELEASE/ja/ArchitectureInDetail/DataAccessDetail/DataAccessJpa.html#)

__■（参考）JPA実装ライブラリ__
Hibernate : Spring Data JPAは基本的にこれを使用。
※JPAの参照実装であるEclipseLinkではありません。
※ライブラリ "org.springframework.boot/spring-boot-starter-data-jpa"

<details><summary>__（参考）JPAのVersionとJSR(Java Specification Request)__</summary><div>

1. 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

2. 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

3. 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
</dev>
</details>