java - ejemplo - typedquery
¿Qué significa un guión bajo concatenado a un nombre de clase? (2)
Estaba leyendo el artículo "Consultas dinámicas y seguras en JPA 2.0" y me topé con este ejemplo:
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í?
Dado que un guión bajo es una parte válida de un nombre de clase, no entiendo por qué se puede usar en JPA. Verifiqué esto con una entidad existente en mi código y, por supuesto, mi clase no se pudo resolver como ClassName_
Encontré esta manera 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;
}
Ese es el metamodel para la persistencia. Es cómo puedes hacer consultas seguras de tipo JPA en Java. Permite que las consultas verifiquen sus consultas de forma Bar_
porque la clase Bar_
describe su Bar
JPA. En HQL, puede confundir fácilmente una consulta y no conocerla hasta que se ejecute.
Así que técnicamente, _
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.