【问题标题】: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 这样做了,我永远也找不到这个问题和答案,我还在寻找。

标签: java jpa criteria-api


【解决方案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 注释,你就可以随意命名实际的类。
猜你喜欢
  • 2016-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-25
  • 2015-02-08
  • 1970-01-01
  • 2012-10-23
相关资源
最近更新 更多