web-dev-qa-db-ja.com

クラス名に連結されたアンダースコアはどういう意味ですか?

私は "JPA 2.0での動的でタイプセーフなクエリ" の記事を読んでいて、この例に出くわしました。

EntityManager em = ...
CriteriaBuilder qb = em.getCriteriaBuilder();
CriteriaQuery<Person> c = qb.createQuery(Person.class);
Root<Person> p = c.from(Person.class);
Predicate condition = qb.gt(p.get(Person_.age), 20);
//                                     ^^ --- this one
c.where(condition);
TypedQuery<Person> q = em.createQuery(c); 
List<Person> result = q.getResultList();

ここでアンダースコアは正確にはどういう意味ですか?

アンダースコアはクラス名の有効な部分であるため、JPAでこれを使用できる理由がわかりません。私はコード内の既存のエンティティでこれをチェックしましたが、もちろん私のクラスはClassName_

31
stacker

つまり、永続性の メタモデル です。これは、JavaでタイプセーフなJPAクエリを実行する方法です。 classBar_がJPA Barを記述しているため、クエリでクエリを静的にチェックできます。 HQLでは、クエリを簡単に入力ミスして、実行するまでそれを知ることができません。

したがって、技術的には、_は何も意味しませんが、JPAがJPA永続モデルクラスのメタモデルクラスに名前を付けるために使用する規則です。 Model_Modelのメタモデルであり、クエリ可能なフィールドの名前とそのタイプを提供します。

23
Tobogganski

この article でメタモデルを宣言するこの方法を見つけました。

/**
 * A  meta model class used to create type safe queries from person
 * information.
 * @author Petri Kainulainen
 */
@StaticMetamodel(Person.class)
public class Person_ {
    public static volatile SingularAttribute<Person, String> lastName;
}
2
stacker