Рубрики
Без рубрики

Запросы Критериев С Использованием Метамодели JPA

Узнайте, как использовать метамодель Jpa для создания запросов критериев.

Автор оригинала: baeldung.

1. Обзор

В этом руководстве мы обсудим, как использовать статические классы метамодели JPA при написании запросов критериев в режиме гибернации.

Нам понадобится базовое понимание API запросов критериев в Hibernate, поэтому, пожалуйста, ознакомьтесь с нашим учебником по запросам критериев для получения дополнительной информации по этой теме, если это необходимо.

2. Почему метамодель JPA?

Часто, когда мы пишем запрос критериев, нам нужно ссылаться на классы сущностей и их атрибуты.

Теперь один из способов сделать это-предоставить имена атрибутов в виде строк. Но у этого есть несколько недостатков.

Во-первых, мы должны искать имена атрибутов сущностей. И в случае, если имя столбца будет изменено позже в жизненном цикле проекта, мы должны рефакторировать каждый запрос, в котором используется это имя.

Метамодель JPA была введена сообществом, чтобы избежать этих недостатков и обеспечить статический доступ к метаданным классов управляемых сущностей.

3. Класс сущностей

Давайте рассмотрим сценарий, в котором мы создаем систему управления студенческим порталом для одного из наших клиентов, и возникает требование предоставить функцию поиска по Студентам на основе их выпускного года.

Во-первых, давайте посмотрим на наш Студент класс:

@Entity
@Table(name = "students")
public class Student {
    
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int id;

    @Column(name = "first_name")
    private String firstName;

    @Column(name = "last_name")
    private String lastName;

    @Column(name = "grad_year")
    private int gradYear;

    // standard getters and setters
}

4. Создание классов метамоделей JPA

Затем нам нужно сгенерировать классы метамоделей, и для этой цели мы будем использовать инструмент генератора метамоделей, предоставленный JBoss . JBoss-это всего лишь один из многих инструментов, доступных для создания метамодели. Другие подходящие инструменты включают EclipseLink , OpenJPA и DataNucleus .

Чтобы использовать инструмент JBoss, нам нужно добавить последнюю зависимость в ваш pom.xml файл, и инструмент сгенерирует классы метамодели, как только мы запустим команду maven build:


    org.hibernate
    hibernate-jpamodelgen
    5.3.7.Final

Обратите внимание, что нам нужно добавить папку target/generated-classes в путь к классам вашей IDE , так как по умолчанию классы будут создаваться только в этой папке.

5. Статические классы метамоделей JPA

На основе спецификации JPA созданный класс будет находиться в том же пакете, что и соответствующий класс сущностей, и будет иметь то же имя с добавлением “_” (подчеркивание) в конце. Итак, класс метамодели, созданный для класса Student , будет Student_ | и будет выглядеть примерно так:

@Generated(value = "org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor")
@StaticMetamodel(Student.class)
public abstract class Student_ {

    public static volatile SingularAttribute firstName;
    public static volatile SingularAttribute lastName;
    public static volatile SingularAttribute id;
    public static volatile SingularAttribute gradYear;

    public static final String FIRST_NAME = "firstName";
    public static final String LAST_NAME = "lastName";
    public static final String ID = "id";
    public static final String GRAD_YEAR = "gradYear";
}

6. Использование классов метамоделей JPA

Мы можем использовать статические классы метамодели так же, как мы использовали бы ссылки String на атрибуты. API запросов критериев предоставляет перегруженные методы, которые принимают Строки ссылки, а также Атрибуты реализации интерфейса.

Давайте посмотрим на запрос критериев, который будет получать все Студенты , окончившие в 2015 году:

//session set-up code
CriteriaBuilder cb = session.getCriteriaBuilder();
CriteriaQuery criteriaQuery = cb.createQuery(Student.class);

Root root = criteriaQuery.from(Student.class);
criteriaQuery.select(root).where(cb.equal(root.get(Student_.gradYear), 2015));

Query query = session.createQuery(criteriaQuery);
List results = query.getResultList();

Обратите внимание, как мы использовали ссылку Student_.grad Year вместо обычного имени столбца grade_year .

7. Заключение

В этой краткой статье мы узнали, как использовать статические классы метамоделей и почему они могут быть предпочтительнее традиционного способа использования ссылок String , как описано ранее.

Исходный код этого учебника можно найти на Github .