2012-02-21 15 views
18

estaba leyendo el artículo "Dynamic, typesafe queries in JPA 2.0" y tropezamos con este ejemplo:¿Qué significa un carácter de subrayado concatenado con un nombre de clase?

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(); 

Me preguntaba, ¿qué significa exactamente el subrayado aquí?

Como un guión bajo es una parte válida de un nombre de clase, no entiendo por qué se puede usar en JPA. Comprobé esto con una entidad existente en mi código y, por supuesto, mi clase no se pudo resolver como ClassName_

+0

También puede hacer esta pregunta a ese autor del artículo :) – Jayy

Respuesta

15

Esa es la metamodel para la persistencia. Es la forma en que puede escribir consultas JPA seguras en Java. Permite que las consultas verifiquen sus consultas de forma estática porque la clase Bar_ describe su JPA Bar. En HQL, puede escribir fácilmente una consulta y no conocerla hasta que se ejecute.

Por lo tanto, técnicamente, el _ no significa nada, pero es la convención utilizada por JPA para nombrar una clase de metamodelo de una clase de modelo persistente JPA. Model_ es el metamodelo de Model y proporciona los nombres de los campos consultables y sus tipos.

+0

¿Debo incluir otra dependencia de maven? El 'Bar_'debe ser conocido por el compilador, que actualmente no es el caso. – stacker

+1

Bueno, podrías escribir el metamodelo a mano, hacer que se genere y luego copiar los archivos a mano, o incorporarlo en tu compilación Maven. Encontré [este plugin de Maven] (http://janistoolbox.typepad.com/blog/2010/03/java-persistency-api-20-jpa-hibernate-jpa-metamodel-generator-maven-1.html) que podría Hacer el trabajo. – ArtB

+0

@stacker hizo esa ayuda de complemento? Si es así, lo agregaré a la respuesta en sí. – ArtB

0

Encontré esta forma de declarar el metamodelo en este 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

Esto es a lo que me refería al hacerlo a mano. :) Estoy bastante seguro de que, siempre que tengas la anotación '@ StaticMetamodel', puedes ponerle nombre a la clase real como quieras. – ArtB

Cuestiones relacionadas