连接到类名的下划线是啥意思?

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_ 类。在编写谓词时非常有用。 &lt;dependency&gt; &lt;groupId&gt;org.hibernate&lt;/groupId&gt; &lt;artifactId&gt;hibernate-jpamodelgen&lt;/artifactId&gt; &lt;/dependency&gt;【参考方案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 注释,你就可以随意命名实际的类。

以上是关于连接到类名的下划线是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

导入语句前面的下划线是啥意思?

python命名规则是啥?

Swiftui 中 init() 中变量前的下划线是啥意思?

python中的双下划线__是啥意思? [复制]

斜线双下划线斜线是啥意思? /__/

$this->_objectProperty 中的下划线是啥意思? [复制]