Что означает подчеркивание, связанное с именем класса?
Я читал этот articel наткнулся на этот пример:
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_
Ответы
Ответ 1
То есть метамодель для стойкости. Именно так вы можете создавать безопасные запросы JPA в Java. Он позволяет запросам статически проверять ваши запросы, потому что класс Bar_
описывает вашу JPA Bar
. В HQL вы можете легко ошибиться при запросе, если не знаете его, пока он не будет запущен.
Так технически, _
ничего не значит, но это соглашение, используемое JPA, для обозначения класса метамодели устойчивого класса JPA. Model_
- метамодель Model
, и она предоставляет имена запрашиваемых полей и их типов.
Ответ 2
Я нашел этот способ объявить метамодель в этой статье .
/**
* 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;
}