What does an underscore concatenated to a class na

2020-05-18 05:26发布

I was reading the "Dynamic, typesafe queries in JPA 2.0" article and stumbled upon this example:

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();

I was wondering, what exactly does the underscore here mean?

Since an underscore it is a valid part of a classname I don't understand why this can be used in JPA. I checked this with an existing entity in my code and of course my class couldn't be resolved as ClassName_

2条回答
迷人小祖宗
2楼-- · 2020-05-18 05:40

That is the metamodel for the persistance. It is how you can do type safe JPA queries in Java. It allows queries to staticly check your queries because classBar_ describes your JPA Bar. In HQL, you can easily mistype a query and not know it until it is run.

So technically, the _ does not mean anything, but it is the convention used by JPA to name a metamodel class of a JPA persistent model class. Model_ is the metamodel of Model, and it provides the names of the queryable fields and their types.

查看更多
够拽才男人
3楼-- · 2020-05-18 05:51

I found this way to declare the metamodel in this 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;
}
查看更多
登录 后发表回答