连接到类名的下划线是啥意思?
Posted
技术标签:
【中文标题】连接到类名的下划线是啥意思?【英文标题】:What does an underscore concatenated to a class name mean?连接到类名的下划线是什么意思? 【发布时间】:2012-03-11 21:07:21 【问题描述】:我在阅读"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_
【问题讨论】:
你也可以问那个文章作者这个问题:) 如果 stacker 这样做了,我永远也找不到这个问题和答案,我还在寻找。 【参考方案1】:这是持久性的metamodel。这是您在 Java 中执行类型安全 JPA 查询的方法。它允许查询静态检查您的查询,因为 classBar_
描述了您的 JPA Bar
。在 HQL 中,您很容易输入错误的查询,直到它运行才知道。
所以从技术上讲,_
没有任何意义,但它是 JPA 用来命名 JPA 持久模型类的元模型类的约定。 Model_
是Model
的元模型,它提供了可查询字段的名称及其类型。
【讨论】:
我是否必须包含另一个 maven 依赖项?Bar_
必须被编译器知道,但目前不是这样。
您可以手动编写元模型,生成它,然后手动复制文件,或者将其合并到您的 Maven 构建中。我发现 this Maven plugin 可以胜任这项工作。
@stacker 那个插件有帮助吗?如果是这样,我会将其添加到答案本身。
感谢您的解释,但我决定不再依赖其他库。我将继续使用本机查询 ;-)
以下依赖会生成 Person_ 类。在编写谓词时非常有用。 <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-jpamodelgen</artifactId> </dependency>
【参考方案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;
【讨论】:
这就是我所说的手工操作。 :) 我很确定,只要你有@StaticMetamodel
注释,你就可以随意命名实际的类。以上是关于连接到类名的下划线是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章