Jakarta EE 10 - JPA 3.1 の変更点


はじめに

Jakarta EE 10 で、JPA は 3.0 から 3.1 となります。

仕様策定中で公式にFIXされてはいませんが、現時点(2022年2月時点)での変更点のまとめです。

マイナーバージョンアップということで変更点はそれほどありません。


datetime function の追加

JPQL に EXTRACT() が追加され、日時から特定の部分を抽出可能になりました。

使い方は以下のようになります。

FROM Course c WHERE c.year = EXTRACT(YEAR FROM CURRENT_DATE)

上記では YEAR として年を抽出しています。

キーワードは YEAR, QUARTER, MONTH, WEEK, DAY, HOUR, MINUTE, SECOND が利用できます。


java.util.UUID データタイプのネイティブサポート追加

java.util.UUID がデータタイプのサポートに追加されました。 エンティティフィールド型または JPA クエリパラメータとして java.util.UUID を利用可能になります。


GenerationType.UUID の追加

ID の生成ストラテジとして GenerationType.UUID が追加されます。

@Id
@GeneratedValue(strategy = GenerationType.UUID)
UUID id;

デフォルトでは、プラットフォーム(DB)から UUID 値を取得しようとし、プラットフォームがサポートしていない場合は、org.eclipse.persistence.sequencing.UUIDSequence を参照して、UUID.randomUUUID() を呼び出します。


EntityManager(Factory) の AutoCloseable 実装

EntityManager と EntityManagerFactory に AutoCloseable が implement され、try-with-resources で扱えるようになりました。


いくつかの数値関数の追加

CriteriaBuilder にいくつかの数値関数が追加されました。

  • sign()
  • ceiling()
  • floor()
  • exp()
  • ln()
  • power()
  • round()

JPQL でも同関数が利用可能です。


local date/time 用の関数の追加

CriteriaBuilderLocalDate, LocalDateTime, LocalTime 用の以下が追加されました。

    /**
     *  Create expression to return current local date.
     *  @return expression for current date
     */
    Expression<java.time.LocalDate> localDate();

    /**
     *  Create expression to return current local datetime.
     *  @return expression for current timestamp
     */
    Expression<java.time.LocalDateTime> localDateTime();

    /**
     *  Create expression to return current local time.
     *  @return expression for current time
     */
    Expression<java.time.LocalTime> localTime();

旧来の currentDate() などでは、現在では推奨されない java.sql.Date を返すものでしたが、この変更により、 java.time.* を扱えるようになりました。

JPQL では LOCAL DATE LOCAL TIME LOCAL DATETIME キーワードとして使うことができます。


PersistenceException 系で原因例外がネスト可能となった

PersistenceException のサブクラス(EntityNotFoundException, NonUniqueResultException, TransactionRequiredException) に Exception cause を引数に取るコンストラクタが追加されました。今までは、原因例外を設定することができませんでした。


java.instrument への推移的依存の解消

JPA API の module-info から java.instrument が削除されました。 マイクロサービス対応なども視野に、本質的ではない依存をスリムにしていきたいという意図です。これにより内部実装に多少変更が入っています。


Criteria CASE 式の拡張

Criteria CASE 式で条件に Expressions を指定できるようになりました。

/**
 * Add a when/then clause to the case expression.
 * @param condition  "when" condition
 * @param result  "then" result value
 * @return simple case expression
 */
SimpleCase<C, R> when(Expression<? extends C> condition, R result);

/**
 * Add a when/then clause to the case expression.
 * @param condition  "when" condition
 * @param result  "then" result expression
 * @return simple case expression
 */
SimpleCase<C, R> when(Expression<? extends C> condition, Expression<? extends R> result);