2012-02-21 90 views
18

我读"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_

+0

你也可以问这篇文章的作者:)这个问题 – Jayy 2012-02-21 14:51:02

回答

15

这就是持久性的metamodel。这是如何在Java中执行类型安全的JPA查询。它允许查询静态检查您的查询,因为Bar_类描述了您的JPA Bar。在HQL中,您可能很容易错误地输入查询,直到它运行时才会知道它。

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

+0

我必须包含另一个maven依赖吗? 'Bar_'必须由编译器知道,目前情况不是这样。 – stacker 2012-02-21 15:09:35

+1

那么你可以手动编写元模型,让它生成,然后手工复制这些文件,或者将它合并到你的Maven构建中。我发现[这个Maven插件](http://janistoolbox.typepad.com/blog/2010/03/java-persistent-api-20-jpa-hibernate-jpa-metamodel-generator-maven-1.html),可能做这项工作。 – ArtB 2012-02-21 15:12:57

+0

@stacker是否可以帮助插件?如果是这样,我会将它添加到答案本身。 – ArtB 2012-02-21 15:40:29

0

我发现这种方式来声明此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; 
} 
+0

这就是我所指的手工操作。 :)我非常肯定,只要你有他们'@ StaticMetamodel'注释你可以命名实际的类,不管你喜欢什么。 – ArtB 2012-02-21 17:08:24

相关问题