API dei criteri
L'API dei criteri è più adatta per le query generate dinamicamente. Pertanto, se si desidera aggiungere filtri della clausola WHERE, clausole JOIN o variare la clausola ORDER BY o le colonne di proiezione, l'API Criteria può aiutarti a generare la query in modo dinamico in modo da prevenire anche attacchi SQL Injection .
D'altra parte, le query sui criteri sono meno espressive e possono persino portare a query SQL molto complicate e inefficienti, come spiegato in questo articolo .
JPQL e HQL
JPQL è il linguaggio di query dell'entità standard JPA mentre HQL estende JPQL e aggiunge alcune funzionalità specifiche di Hibernate.
JPQL e HQL sono molto espressivi e assomigliano a SQL. A differenza dell'API Criteria, JPQL e HQL semplificano la previsione della query SQL sottostante generata dal provider JPA. È anche molto più facile rivedere le proprie query HQL rispetto a quelle di Criteria.
Vale la pena notare che la selezione di entità con JPQL o API Criteria ha senso se è necessario modificarle. Altrimenti, una proiezione DTO è una scelta molto migliore.
Conclusione
Se non è necessario variare la struttura della query dell'entità, utilizzare JPQL o HQL. Se è necessario modificare i criteri di filtro o di ordinamento o modificare la proiezione, utilizzare l'API Criteria.
Tuttavia, solo perché stai usando JPA o Hibernate, ciò non significa che non dovresti usare SQL nativo. Le query SQL sono molto utili e le API JPQL e Criteria non sostituiscono SQL. Consulta questo articolo per maggiori dettagli su questo argomento.