Domanda

Esiste un euristico / best practice / set di regole per una decisione tra Criteria API e NamedQuery ?

I miei pensieri fino ad ora:
Le query con nome sono generalmente più leggibili.Le query sui criteri sono più flessibili.
Entrambi sono precompilati.Tendo a fare affidamento sull'utilizzo di query con nome il più a lungo possibile, quindi sul passaggio ai criteri.

Ma forse l'impulso a "flessificare" la query utilizzando i criteri API è un suggerimento per una progettazione non ottimale (ovvero separazione delle preoccupazioni)?

Grazie

È stato utile?

Soluzione

Le query con nome sono più ottimali (vengono analizzate / preparate una volta).Le query dei criteri sono dinamiche (non sono precompilate, sebbene alcuni fornitori di JPA come EclipseLink mantengano un criterio per preparare la cache).

Utilizzerei i criteri solo per le query dinamiche.

Altri suggerimenti

Le query con criteri sono una buona scelta quando una query deve essere generata dinamicamente, sulla base di criteri di ricerca variabili e multipli, ad esempio.

Per le query statiche, JPQL è molto più leggibile e preferisco usarli rispetto alle query con criteri.Potresti perdere un po 'di sicurezza, ma gli unit test dovrebbero renderti più sicuro.

Un altro punto di vista è che, sebbene la query sui criteri non sia così leggibile, è sicura per i tipi, quindi fornisce il controllo del tipo in fase di compilazione.Se modifichi il database in progetti in cui sono presenti molte entità e molte query, è davvero utile vedere in fase di compilazione quali query sono andate storte a causa della modifica.

D'altra parte, non sono sicuro che sia più vantaggioso della semplicità di JPQL

In realtà ho esaminato i sorgenti Hibernate (4.3.0-SNAPSHOT) e EclipseLink (2.5.0-SNAPSHOT) e ho esaminato l'implementazione JPA in ciascuno.

EclipseLink chiaramente non è thread-safe nel modo in cui descrivi.In particolare, tenta di ricalcolare i join ripetutamente.

L'implementazione di Hibernate mi sembra sicura per i thread.Non ne sono sicuro al 100%, ma sembra che lo sia.Direi che non è garantito che ciò sia vero in futuro poiché non è specificato.

Tuttavia, ti avverto, non penso che guadagnerai molto.Da quello che sto osservando, gran parte della compilazione della query viene effettivamente eseguita durante la fase "createQuery", quindi non si otterrebbe nemmeno molto memorizzando nella cache i risultati.

JPA fornisce anche un modo per creare query statiche, come query denominate, utilizzando le annotazioni @NamedQuery e @NamedQueries.È considerata una buona pratica in JPA preferire le query con nome rispetto alle query dinamiche, quando possibile.Da http://www.objectdb.com/java/jpa/query/api

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top