lunedì 11 agosto 2014

Query Hibernate con Criteria

Con Hibernate l'interazione tra applicazione e database avviene tramite HQL e JPQL, linguaggi ad hoc per astrarre la logica relazionale e lavorare direttamente ad oggetti. Tuttavia esiste un metodo alternativo di manipolare e interrogare i dati delle tabelle. Criteria API consente di creare un oggetto con dei criteri di programmazione in cui è possibile applicare delle regole di filtraggio e condizioni logiche.

L'interfaccia Session fornisce il metodo createCriteria(), il quale crea un oggetto Criteria che restituisce istanze della classe dell'oggetto in persistenza.
Di seguito un semplice esempio di una query criteria che restituisce un oggetto corrispondente alla classe Utente.

Criteria cr = session.createCriteria(Utente.class);
List results = cr.list();

E' possibile usare il metodo add() per aggiungere restrizioni alle query con criteria. Supponendo di disporre di una tabella "utente" contenente un campo "eta", l'esempio di seguito aggiunge una restrizione che restituisce gli utenti con un'età superiore ai 30 anni.

Criteria cr = session.createCriteria(Utente.class);
cr.add(Restrictions.eq("eta", 30));
List results = cr.list();

Di seguito altri esempi di Restrictions.

Criteria cr = session.createCriteria(Utente.class);

// Restituisce utenti con età superiore ai 30 anni.
cr.add(Restrictions.gt("eta", 30));

// Restituisce utenti con età inferiore ai 30 anni.
cr.add(Restrictions.lt("eta", 30));

// Restituisce utenti col nome che inizia con Gian
cr.add(Restrictions.like("nome", "Gian%"));

// Restituisce utenti con età compresa tra i 20 e i 30 anni.
cr.add(Restrictions.between("eta", 20, 30));

// Verifica se il campo è nullo
cr.add(Restrictions.isNull("eta"));

// Verifica che il campo non sia vuoto
cr.add(Restrictions.isNotEmpty("eta"));


Con Criteria è possibile anche ordinare e aggregare i risultati.

Criteria cr = session.createCriteria(Utente.class);

// Ordina gli utenti per età discendente
cr.addOrder(Order.desc("eta"));

// Conta le righe totali.
cr.setProjection(Projections.rowCount());

// Restituisce l'età più alta.
cr.setProjection(Projections.max("eta"));

// Restituisce l'età media.
cr.setProjection(Projections.avg("eta"));



Hai apprezzato questo post? Conferma le mie competenze o scrivi una segnalazione sul mio profilo Linkedin!