※当サイトの記事には、広告・プロモーションが含まれます。

Spring Data JPAで利用できるクエリ(問い合わせ)が実施されるAPIについて調べてみた

gigazine.net

一般的に技術系企業が新たな技術に対してフィードバックを得たり、人材を集めたり、サポーターのコミュニティを形成したりするためにオープンソース化することは珍しいことではありません。しかしGoogleは、Transformerをすぐにオープンソース化せず、自社に利益をもたらすサービスに成長させるための研究を続けていました。一方で、AI開発企業のOpenAIはTransformerを用いて、検索大手であるGoogleに対して深刻な脅威になり得るChatGPTを開発しました。

ジェネレーティブAIの進歩に大きな影響を与えた「Transformer」を開発した研究者らはなぜGoogleを去ったのか? - GIGAZINE

Googleさん、経営が苦しいのかしら?

JPAJava Persistence API)」とは?バージョンによっては、「JPAJakarta Persistence API)」になっている

公開されてる「JPAJava Persistence API)」の仕様書によると、

Introduction

This document is the specification of the Java API for the management of persistence and object/relational mapping with Java EE and Java SE. The technical objective of this work is to provide an object/relational mapping facility for the Java application developer using a Java domain model to manage a relational database.

https://download.oracle.com/otn-pub/jcp/persistence-2_2-mrel-spec/JavaPersistence.pdf

Javaのオブジェクトと「RDBMS(Relational DataBase Management System)」の「ORM(Object Relational Mapping)」の機能を提供することが目的であると。

「ORM(Object Relational Mapping)」はと言うと、

Object–relational mapping (ORMO/RM, and O/R mapping tool) in computer science is a programming technique for converting data between a relational database and the heap of an object-oriented programming language. This creates, in effect, a virtual object database that can be used from within the programming language.

https://en.wikipedia.org/wiki/Object%E2%80%93relational_mapping

⇧ とあるように、

の間でデータを変換する技術ですと。

で、「JPAJava Persistence API)」と「JPAJakarta Persistence API)」の違いはと言うと、Oracleの公式のブログで、

厳密な意味でのJava EEの最新リリースは、2017年8月のJava EE 8でした。このリリースは範囲が限定されたものでしたが、Java EE Securityなどの重要な機能も含まれていました。その年のうちに、オラクルはJava EEオープンソース団体に完全に移管することを決めました。そして、Java EEパートナーのRed HatIBMの協力のもと、完全なリファレンス実装およびTechnology Compatibility Kit(TCK)とともに、Java EEEclipse Foundationに移管されることに決まりました。

https://blogs.oracle.com/otnjp/post/transition-from-java-ee-to-jakarta-ee-ja

Java EE 8 から「JPA」の仕様を管理する団体が変わったことにより、名前が変わったらしい。

おそらく、Spring Framework の各プロジェクトで利用されているJava EEAPIについても、どこかのバージョンでjakarta EEに変わってるんだとは思う。

英語版のWikipediaの「JPAJakarta Persistence API)」の説明だと、

Jakarta Persistence API (JPA; formerly Java Persistence API) is a Jakarta EE application programming interface specification that describes the management of relational data in enterprise Java applications.

Persistence in this context covers three areas:

The reference implementation for JPA is EclipseLink.

https://en.wikipedia.org/wiki/Jakarta_Persistence

The final release date of the JPA 1.0 specification was 11 May 2006 as part of Java Community Process JSR 220. The JPA 2.0 specification was released 10 December 2009 (the Java EE 6 platform requires JPA 2.0). The JPA 2.1 specification was released 22 April 2013 (the Java EE 7 platform requires JPA 2.1). The JPA 2.2 specification was released in the summer of 2017. The JPA 3.1 specification, the latest version, was released in the spring of 2022 as part of Jakarta EE 10.

https://en.wikipedia.org/wiki/Jakarta_Persistence

⇧ とあるので、APIの仕様書については、

  • The Java Persistence 2.1 specification
  • The Java Persistence 2.2 specification
  • The Jakarta Persistence 3.0 specification
  • The Jakarta Persistence 3.1 specification

3.1版が最新っぽいけれど、

jakarta.ee

Introduction 

This document is the specification of the Jakarta API for the management of persistence and object/relational mapping with Jakarta EE and Java SE. The technical objective of this work is to provide an object/relational mapping facility for the Java application developer using a Java domain model to manage a relational database.

https://jakarta.ee/specifications/persistence/3.1/jakarta-persistence-spec-3.1

⇧ 根本的な機能は変わっていないと思う。

話を戻すと、『 Javaのオブジェクトと「RDBMS(Relational DataBase Management System)」の「ORM(Object Relational Mapping)」の機能』が主目的なわけなのだけど、stackoverflowによると、

stackoverflow.com

⇧ 上図のように、

と経由している。

つまり、「JPAJava Persistence API)」単独で「RDBMS(Relational DataBase Management System)」とのデータ変換をしてるわけでは無さそう。

Hibernate」のドキュメントを見た感じ、代表的な2つの利用方法の概要図が紹介されていて、

The "minimal" architecture has the application provide its own JDBC connections and manage its own transactions. This approach uses a minimal subset of Hibernate's APIs:

https://docs.jboss.org/hibernate/core/3.5/reference/en/html/architecture.html

The "comprehensive" architecture abstracts the application away from the underlying JDBC/JTA APIs and allows Hibernate to manage the details.

https://docs.jboss.org/hibernate/core/3.5/reference/en/html/architecture.html

⇧「The "comprehensive" architecture」の方が一般的ということなんかね?

JPAJava Persistence API)」以外にも必要なものがあると考えておけば良いんかね?

これについては、

stackoverflow.com

JPA is just an API (hence Java Persistence API) that requires an implementation to use.

https://stackoverflow.com/questions/4477082/what-is-a-jpa-implementation

⇧ 上図のように、「JPAJava Persistence API)」は仕様であるので、実装が必要であって、その実装が「Hibernate」や「EclipseLink」だったりしますと。

Wikipediaさんによりますと、

Java Persistence APIJPA)とは、関係データベースのデータを扱うJava SEおよびJakarta EE(旧・Java EE)のアプリケーションを開発するためのJavaフレームワークである。

JPAは、以下の3つの部分から成る。

  • API(javax.persistence パッケージで定義されている)
  • Java Persistence Query Language
  • オブジェクト/関係メタデータ

JPAリファレンス実装EclipseLinkとして実装されている。

https://ja.wikipedia.org/wiki/Java_Persistence_API

⇧ とのこと。

英語版の「JPAJakarta Persistence API)」のWikipediaの情報だと、

JPA 2.2

Development of JPA 2.2, a maintenance release, began in 2017 under JSR 338. The maintenance review was approved on 19 June 2017.

Main features included were:

  • The addition of @Repeatable to all relevant annotations
  • Support for JPA annotations to be used in metaannotations
  • Streaming for query results
  • The ability for AttributeConverters to be CDI-injectable
  • Support for Java 8 date and time types

Vendors supporting JPA 2.2:

https://en.wikipedia.org/wiki/Jakarta_Persistence

Jakarta Persistence 3.0

The JPA was renamed as Jakarta Persistence in 2019 and version 3.0 was released in 2020. This included the renaming of packages and properties from javax.persistence to jakarta.persistence.

Vendors supporting Jakarta Persistence 3.0:

https://en.wikipedia.org/wiki/Jakarta_Persistence

Jakarta Persistence 3.1

Version 3.1 was released in 2022. It is part of Jakarta EE 10, and thus requires at least Java 11 to run.

Vendors supporting Jakarta Persistence 3.1:

https://en.wikipedia.org/wiki/Jakarta_Persistence

⇧ 詳しくサポートされてる実装が掲載されている。

3.1 で何が変わったかは、

blog1.mammb.com

megascus.hatenablog.com

⇧ 上記サイト様がまとめて下さっていました。

Spring Data JPAとは?

で、「Spring Framework 」には、

spring.pleiades.io

Spring Data の使命は、基礎となるデータストアの特殊な特性を保持したまま、データアクセス用の使い慣れた一貫した Spring ベースのプログラミングモデルを提供することです。

https://spring.pleiades.io/projects/spring-data

⇧「Spring Data」というプロジェクトが存在しており、「Spring Data JPA」は、「Spring Data」の内の1つらしく、

spring.pleiades.io

より大きな Spring Data ファミリーの一部である Spring Data JPA を使用すると、JPA ベースのリポジトリを簡単に実装できます。このモジュールは、JPA ベースのデータアクセスレイヤーの拡張サポートを扱います。これにより、データアクセステクノロジーを使用する Spring ベースのアプリケーションを簡単に構築できます

https://spring.pleiades.io/projects/spring-data-jpa

spring.pleiades.io

1. 序文

Spring Data JPA は、Jakarta Persistence APIJPA)のリポジトリサポートを提供します。これにより、JPA データソースにアクセスする必要のあるアプリケーションの開発が容易になります。

https://spring.pleiades.io/spring-data/jpa/docs/current/reference/html/

⇧「JPAJava Persistence API)」との関係性がいまいちよく分からん...

公式の情報ではないのだけど、

www.java67.com

⇧ 上図のような感じが正しいとすると、「JPAJava Persistence API)」のラッパーってことになるんかね?

Wikipediaの情報によりますと、

Spring Data JPA

The Spring Data JPA is an implementation of the repository abstraction that is a key building block of domain-driven design based on the Java application framework Spring. It transparently supports all available JPA implementations and supports CRUD operations as well as the convenient execution of database queries.

https://en.wikipedia.org/wiki/Jakarta_Persistence

⇧ とのことなので、「JPAJava Persistence API)」乃至は「JPAJakarta Persistence API)」でできることは全て「Spring Data JPA」でサポートされてるってことみたい。

Spring Data JPAで利用できるクエリ(問い合わせ)が実施されるAPIについて調べてみた

「Last Published: 2012-05-06」とあるので、いまでも有効な情報なのかは分からんのだけど、

docs.spring.io

⇧「Spring Data JPA」の依存関係を見た感じ、

の2つがあることから、「JPAJava Persistence API)」の実装である、

に「Spring Data JPA」は対応していそう。

「Spring Data JPA」のドキュメントの「用語集」によると、

spring.pleiades.io

JPAの実装については、

の2つしか記載が無いので、この2つ以外の実装をサポートしているのかは不明だけども、上記の2つの実装についてはサポートされてると考えて良さそうかと。

話が脱線しましたが、クエリのAPIについて、「Spring Data JPA」のドキュメントによりますと、

spring.pleiades.io

  • EntityManager と直接話す (純粋な HQL/JPQL/EQL/ ネイティブ SQL を記述するか、条件 API を使用する)

https://spring.pleiades.io/spring-data/jpa/docs/current/reference/html/#jpa.query.other-methods

⇧ という記述から、少なくとも、

  1. HQL(Hibernate Query Language)
  2. JPQL(Java Persistence Query Language、Jakarta Persistence Query Language)
  3. EQL(EclipseLink Query Language)
  4. native Query
  5. Criteria API

の5つの方法がある模様。

「条件 API」って説明は、

spring.pleiades.io

JPA 2 は、クエリをプログラムで作成するために使用できる条件 API を導入しています。criteria を記述することにより、ドメインクラスのクエリの where 句を定義します。

https://spring.pleiades.io/spring-data/jpa/docs/current/reference/html/#specifications

⇧ とあるので、

⇧「Criteria API」のことを言っているんだとは思う、たぶん。

何て言うか、Spring Data JPA でクエリが実施されるAPIの全量が把握し辛いなぁ...

学習コストもかかるとは思うけど、その前段階の何が利用可能かを整理し辛いし、使い分けの方針を決めるのも難しいな...

ネットの情報としては、

  1. JPQL(Java Persistence Query Language、Jakarta Persistence Query Language)
  2. native Query
  3. Criteria API

あたりが多い気がするので、この3つを使っていく感じになるんかな?

毎度モヤモヤ感が半端ない...

今回はこのへんで。