Подтвердить что ты не робот

Что означает подчеркивание, связанное с именем класса?

Я читал этот 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_

4b9b3361

Ответ 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;
}