Query sui criteri che utilizzano il metamodello JPA

1. Panoramica

In questo tutorial, discuteremo come utilizzare le classi di metamodello statico JPA durante la scrittura di query di criteri in Hibernate.

Avremo bisogno di una conoscenza di base delle API di query dei criteri in Hibernate, quindi consulta il nostro tutorial sulle query dei criteri per ulteriori informazioni su questo argomento, se necessario.

2. Perché il metamodello JPA?

Spesso, quando scriviamo una query di criteri, dobbiamo fare riferimento a classi di entità e ai loro attributi.

Ora, uno dei modi per farlo è fornire i nomi degli attributi come stringhe. Ma questo ha diversi aspetti negativi.

Per prima cosa, dobbiamo cercare i nomi degli attributi di entità. E, nel caso in cui il nome di una colonna venga modificato in un secondo momento nel ciclo di vita del progetto, dobbiamo refactoring ogni query in cui viene utilizzato il nome.

Il metamodello JPA è stato introdotto dalla comunità per evitare questi inconvenienti e fornire accesso statico ai metadati delle classi di entità gestite.

3. Classe di entità

Consideriamo uno scenario in cui stiamo costruendo un sistema di gestione del portale degli studenti per uno dei nostri clienti e viene richiesto di fornire funzionalità di ricerca agli studenti in base al loro anno di laurea.

Per prima cosa, diamo un'occhiata alla nostra classe Studenti :

@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. Generazione di classi di metamodelli JPA

Successivamente, dobbiamo generare le classi di metamodello e, a tale scopo, utilizzeremo lo strumento di generazione di metamodelli fornito da JBoss. JBoss è solo uno dei tanti strumenti disponibili per generare il metamodello. Altri strumenti adatti includono EclipseLink, OpenJPA e DataNucleus.

Per utilizzare lo strumento JBoss, dobbiamo aggiungere l'ultima dipendenza nel nostro file pom.xml e lo strumento genererà le classi di metamodello una volta attivato il comando di compilazione maven:

 org.hibernate hibernate-jpamodelgen 5.3.7.Final 

Nota, dobbiamo aggiungere la cartella target / generated-classes al classpath del nostro IDE , poiché per impostazione predefinita, le classi verranno generate solo in questa cartella.

5. Classi di metamodelli JPA statici

In base alla specifica JPA, una classe generata risiederà nello stesso pacchetto della classe entità corrispondente e avrà lo stesso nome con un "_" (trattino basso) aggiunto alla fine. Quindi, la classe di metamodello generata per la classe Student sarà Student_ e avrà un aspetto simile a:

@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. Utilizzo delle classi di metamodelli JPA

Possiamo usare le classi di metamodello statico nello stesso modo in cui useremmo i riferimenti String agli attributi. L'API di query dei criteri fornisce metodi sovraccaricati che accettano riferimenti a stringhe e implementazioni dell'interfaccia di attributi .

Diamo un'occhiata alla query sui criteri che recupererà tutti gli studenti che si sono laureati nel 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();

Notate come abbiamo usato la Student_.gradYear di riferimento invece di utilizzare il tradizionale grad_year nome della colonna.

7. Conclusione

In questo rapido articolo, abbiamo imparato come usare le classi di metamodello statico e perché possono essere preferite rispetto al modo tradizionale di usare i riferimenti String come descritto in precedenza.

Il codice sorgente di questo tutorial può essere trovato su Github.