Spring Data JPA offre diverse opzioni per la creazione di query complesse su entità JPA. Tra le più utilizzate troviamo Criteria e Specification, due interfacce che forniscono un modo più potente e flessibile rispetto alle query JPQL semplici.
Vedi anche: Spring vs Spring Boot: conosciamo le differenze
Supponiamo di avere un'entità Persona
con le proprietà nome
e età
. Vogliamo trovare tutte le persone con un nome che inizia con "A" e un'età superiore a 18 anni.
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(Persona.class);
Root root = criteriaQuery.from(Persona.class);
criteriaQuery.where(
criteriaBuilder.and(
criteriaBuilder.like(root.get("nome"), "A%"),
criteriaBuilder.greaterThan(root.get("età"), 18)
)
);
List persone = entityManager.createQuery(criteriaQuery).getResultList();
Specification specification = new Specification() {
@Override
public Predicate toPredicate(Root root, CriteriaQuery query, CriteriaBuilder criteriaBuilder) {
return criteriaBuilder.and(
criteriaBuilder.like(root.get("nome"), "A%"),
criteriaBuilder.greaterThan(root.get("età"), 18)
);
}
};
List persone = repository.findAll(specification);
Caratteristica | Criteria | Specification |
---|---|---|
Sintassi | Basata su metodi | Basata su lambda |
Facilità d'uso | Più facile da usare | Più concisa, ma può essere più difficile da imparare |
Compatibilità | Funziona con qualsiasi entità JPA | Funziona solo con entità JPA che supportano le query di Spring Data JPA |
Potenza | Meno potente di Specification | Funziona solo con entità JPA che supportano le query di Spring Data JPA |
La scelta tra Criteria e Specification dipende dalle tue esigenze specifiche.
- Criteria è una buona scelta se hai bisogno di un modo facile da usare per creare query complesse.
- Specification è una buona scelta se hai bisogno di un modo potente e conciso per creare query complesse.
Valuta la complessità delle query, la tua familiarità con le lambda e le librerie di persistenza utilizzate per prendere la decisione più adatta al tuo progetto.