Заявки за критерии, използващи метамодел JPA

1. Общ преглед

В този урок ще обсъдим как да използваме класовете на JPA статични метамодели, докато пишем заявки за критерии в Hibernate.

Ще ни трябва основно разбиране на API за заявки за критерии в хибернация, така че, моля, разгледайте нашия урок за критерийни заявки за повече информация по тази тема, ако е необходимо.

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 за заявки за критерии предоставя претоварени методи, които приемат String референции, както и реализации на интерфейс на атрибути .

Нека разгледаме заявката за критерии, която ще получи всички студенти , завършили през 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_.gradYear, вместо да използваме конвенционалното име на колоната grad_year .

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

В тази кратка статия научихме как да използваме статични класове на метамодели и защо те могат да бъдат предпочитани пред традиционния начин за използване на String референции, както е описано по-рано.

Изходният код на този урок може да бъде намерен в Github.