Что означает подчеркивание, соединенное с именем класса? - PullRequest
27 голосов
/ 21 февраля 2012

Я читал статью "Динамические, безопасные для типов в 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_

Ответы [ 2 ]

22 голосов
/ 21 февраля 2012

Это метамодель для персистентности.Это то, как вы можете делать безопасные JPA-запросы в Java.Он позволяет запросам статически проверять ваши запросы, потому что класс Bar_ описывает ваш JPA Bar.В HQL вы можете легко неправильно набрать запрос и не знать его до тех пор, пока он не будет запущен.

Таким образом, технически _ ничего не значит, но это соглашение, используемое JPA для именования класса метамодели:JPA постоянный модельный класс.Model_ является метамоделью Model и содержит имена запрашиваемых полей и их типы.

2 голосов
/ 21 февраля 2012

Я нашел этот способ объявления метамодели в этой статье .

/**
 * 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;
}
...