Criteriaquery's met behulp van JPA-metamodel

1. Overzicht

In deze zelfstudie bespreken we hoe u de statische JPA-metamodelklassen kunt gebruiken bij het schrijven van criteriumquery's in Hibernate.

We hebben een basiskennis nodig van API's voor criteriumquery's in Hibernate, dus bekijk indien nodig onze tutorial over criteriumquery's voor meer informatie over dit onderwerp.

2. Waarom het JPA-metamodel?

Wanneer we een criteriumquery schrijven, moeten we vaak verwijzen naar entiteitsklassen en hun attributen.

Een van de manieren om dit te doen, is door de namen van de attributen als tekenreeksen op te geven. Maar dit heeft verschillende nadelen.

Ten eerste moeten we de namen van entiteitsattributen opzoeken. En in het geval dat een kolomnaam later in de levenscyclus van het project wordt gewijzigd, moeten we elke query waarin de naam wordt gebruikt, herstructureren.

Het JPA-metamodel is door de gemeenschap geïntroduceerd om deze nadelen te vermijden en om statische toegang te bieden tot de metadata van de beheerde entiteitsklassen.

3. Entiteitsklasse

Laten we eens kijken naar een scenario waarin we een studentenportaalbeheersysteem bouwen voor een van onze klanten, en er een vereiste komt om zoekfunctionaliteit te bieden op Studenten op basis van hun afstudeerjaar.

Laten we eerst eens kijken naar onze Leerling klasse:

@Entity @Table (naam = "studenten") openbare klas Student {@Id @GeneratedValue (strategie = GenerationType.AUTO) privé int id; @Column (name = "first_name") private String firstName; @Column (name = "last_name") private String lastName; @Column (name = "grad_year") private int gradYear; // standaard getters en setters}

4. Genereren van JPA-metamodel-klassen

Vervolgens moeten we de metamodel-klassen genereren en voor dit doel gebruiken we de metamodel-generator-tool van JBoss. JBoss is slechts een van de vele tools die beschikbaar zijn om het metamodel te genereren. Andere geschikte tools zijn onder meer EclipseLink, OpenJPA en DataNucleus.

Om de JBoss-tool te gebruiken, moeten we de nieuwste afhankelijkheid toevoegen aan onze pom.xml bestand, en de tool zal de metamodel-klassen genereren zodra we het maven build-commando activeren:

 org.hibernate hibernate-jpamodelgen 5.3.7.Final 

Let op, we moeten voeg de target / gegenereerde klassen map naar het klassenpad van onze IDEStandaard worden de klassen alleen in deze map gegenereerd.

5. Statische JPA-metamodelklassen

Op basis van de JPA-specificatie zal een gegenereerde klasse zich in hetzelfde pakket bevinden als de overeenkomstige entiteitsklasse en dezelfde naam hebben met een toegevoegde "_" (onderstrepingsteken) aan het einde. Zo, de metamodel klasse gegenereerd voor de Leerling klasse zal zijn Leerling_en ziet er ongeveer zo uit:

@Generated (value = "org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor") @StaticMetamodel (Student.class) openbare abstracte klasse Student_ {openbare statische vluchtige SingularAttribute firstName; openbare statische vluchtige SingularAttribute achternaam; openbare statische vluchtige SingularAttribute-id; openbare statische vluchtige SingularAttribute gradYear; openbare statische laatste String FIRST_NAME = "firstName"; public static final String LAST_NAME = "lastName"; openbare statische laatste String ID = "id"; public static final String GRAD_YEAR = "gradYear"; }

6. Het gebruik van JPA-metamodel-klassen

We kunnen de statische metamodel-klassen op dezelfde manier gebruiken als de Draad verwijzingen naar attributen. De criteria-query-API biedt overbelaste methoden die accepteren Draad referenties evenals Attribuut interface implementaties.

Laten we eens kijken naar de criteriaquery die alles ophaalt Studenten afgestudeerd in 2015:

// sessieopzetcode 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)); Queryquery = session.createQuery (criteriaQuery); Lijstresultaten = query.getResultList ();

Merk op hoe we het Student_.gradYear referentie in plaats van het conventionele te gebruiken afstudeerjaar kolomnaam.

7. Conclusie

In dit korte artikel hebben we geleerd hoe we statische metamodel-klassen kunnen gebruiken en waarom ze de voorkeur kunnen hebben boven de traditionele manier van gebruiken Draad referenties zoals eerder beschreven.

De broncode van deze tutorial is te vinden op Github.