JPAメタモデルを使用した基準クエリ

1. 概要

このチュートリアルでは、Hibernateで条件クエリを作成しながら、JPA静的メタモデルクラスを使用する方法について説明します。
Hibernateの基準クエリAPIの基本的な理解が必要になるため、必要に応じてこのトピックの詳細についてlink:/hibernate-criteria-queries [基準クエリ]のチュートリアルをご覧ください。

2. なぜJPAメタモデルなのか?

多くの場合、基準クエリを作成するときに、エンティティクラスとその属性を参照する必要があります。
現在、これを行う方法の1つは、属性の名前を文字列として提供することです。 しかし、これにはいくつかの欠点があります。
まず、エンティティ属性の名前を検索する必要があります。 また、プロジェクトのライフサイクルの後半で列名が変更された場合、名前が使用されている各クエリをリファクタリングする必要があります。
https://docs.jboss.org/hibernate/orm/5.0/topical/html/metamodelgen/MetamodelGenerator.html#_canonical_metamodel[JPA Metamodel]は、これらの欠点を回避し、メタデータへの静的アクセスを提供するためにコミュニティによって導入されました管理対象エンティティクラス。

3. エンティティクラス

クライアントの1人に対してStudent Portal Managementシステムを構築し、卒業年度に基づいて_Students_で検索機能を提供するための要件が​​発生するシナリオを考えてみましょう。
まず、_Student_クラスを見てみましょう。
@Entity
@Table(name = "students")
public class Student {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int id;

    @Column(name = "first_name")
    private String firstName;

    @Column(name = "last_name")
    private String lastName;

    @Column(name = "grad_year")
    private int gradYear;

    // standard getters and setters
}

4. JPAメタモデルクラスの生成

次に、メタモデルクラスを生成する必要があります。このために、https://docs.jboss.org/hibernate/orm/5.0/topical/html/metamodelgen/MetamodelGenerator.htmlによって提供されるメタモデルジェネレーターツールを使用します。 [JBoss]。 JBossは、メタモデルを生成するために利用できる多くのツールの1つにすぎません。 その他の適切なツールには、https://wiki.eclipse.org/UserGuide/JPA/Using_the_Canonical_Model_Generator_(ELUG)[EclipseLink]、https://openjpa.apache.org/builds/2.4.1/apache-openjpa/docs/ch13s04が含まれます。 html [OpenJPA]、およびhttp://www.datanucleus.org/products/accessplatform_3_2/jpa/jpql_criteria.html#metamodel[DataNucleus]。
JBossツールを使用するには、_pom.xml_ファイルにhttps://search.maven.org/search?q=g:org.hibernate%20AND%20a:hibernate-jpamodelgen[latestdependency]を追加する必要があります。 maven buildコマンドをトリガーすると、ツールはメタモデルクラスを生成します。
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-jpamodelgen</artifactId>
    <version>5.3.7.Final</version>
</dependency>
デフォルトでは、クラスはこのフォルダでのみ生成されるため、* __ target / generated-classes __folderをIDEのクラスパスに追加する必要があることに注意してください。

5. 静的JPAメタモデルクラス

JPA仕様に基づいて、生成されたクラスは、対応するエンティティクラスと同じパッケージに存在し、末尾に「_」(アンダースコア)が追加された同じ名前になります。 したがって、**** __ Student __classに対して生成されるメタモデルクラスは** __ * Student_ * __になり、次のようになります。
@Generated(value = "org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor")
@StaticMetamodel(Student.class)
public abstract class Student_ {

    public static volatile SingularAttribute<Student, String> firstName;
    public static volatile SingularAttribute<Student, String> lastName;
    public static volatile SingularAttribute<Student, Integer> id;
    public static volatile SingularAttribute<Student, Integer> gradYear;

    public static final String FIRST_NAME = "firstName";
    public static final String LAST_NAME = "lastName";
    public static final String ID = "id";
    public static final String GRAD_YEAR = "gradYear";
}

6. JPAメタモデルクラスの使用

*静的なメタモデルクラスは、属性への__String __referencesを使用するのと同じ方法で使用できます。
2015年に卒業したすべての_Students_を取得する基準クエリを見てみましょう。
//session set-up code
CriteriaBuilder cb = session.getCriteriaBuilder();
CriteriaQuery<Student> criteriaQuery = cb.createQuery(Student.class);

Root<Student> root = criteriaQuery.from(Student.class);
criteriaQuery.select(root).where(cb.equal(root.get(Student_.gradYear), 2015));

Query<Student> query = session.createQuery(criteriaQuery);
List<Student> results = query.getResultList();
従来の__grad_year __column名を使用する代わりに、__Student_.gradYear ___referenceを使用したことに注意してください。

7. 結論

この簡単な記事では、静的メタモデルクラスの使用方法と、前述のように__String __referencesを使用する従来の方法よりも好ましい理由を学びました。
このチュートリアルのソースコードは、https://github.com/eugenp/tutorials/tree/master/persistence-modules/hibernate5 [Github上]にあります。