下划线连接到类名是什么意思?

时间:2012-02-21 14:46:40

标签: java jpa criteria-api

我正在阅读"Dynamic, typesafe queries in 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_

2 个答案:

答案 0 :(得分:21)

这是持久性的metamodel。这是你如何用Java键入安全的JPA查询。它允许查询静态检查您的查询,因为类Bar_描述了您的JPA Bar。在HQL中,您可以轻松输入错误的查询,直到它运行才知道它。

从技术上讲,_并不意味着什么,但它是JPA用来命名JPA持久模型类的元模型类的约定。 Model_Model的元模型,它提供可查询字段及其类型的名称。

答案 1 :(得分:2)

我发现这种方式可以在此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;
}