2012-01-24 20 views
6

Stavo passando in letargo e situazioni in cui utilizzare Criteria vs HQL e la mia comprensione è che con Hibernate, ogni volta che stiamo interrogando il database sia da Criteria o HQL in entrambe le istanze di sospensione otterrebbe risultato impostato e messo in memoria e poi quando chiamiamo quello query di nuovo, i dati verrebbero recuperati dalla memoria piuttosto che colpire quel database, la mia comprensione è corretta?La query HQL colpisce sempre il database e ottiene risultati?

Inoltre, come si può vedere dai commenti alla domanda menzionata di seguito, è stato suggerito che Hibernate Criteria otterrebbe i dati dalla sessione e HQL andrebbe sempre a colpire il database e quindi qualsiasi numero di chiamate multiple alla query HQL andrà a colpire il database e se questo è il caso, allora HQL causa più problemi che soluzioni.

Si prega gentilmente di comunicarlo perché sono un po 'confuso con la situazione.

riferimento al question

risposta

7

Dipende da che tipo di domande che si stanno facendo e sulle impostazioni della cache.

Hibernate ha tre tipi di cache: cache di sessione, cache di query e cache di secondo livello. La cache di sessione è sempre attiva ma gli altri due possono essere disattivati.

In genere la memorizzazione nella cache non è il motivo per favorire l'API dei criteri su HQL o viceversa. Sono per lo più solo interfacce diverse essenzialmente per la stessa cosa.

Vedi http://www.javalobby.org/java/forums/t48846.html e http://docs.jboss.org/hibernate/core/3.3/reference/en/html/performance.html

+1

per quanto ne so una query HQL utilizza solo la cache delle query e solo ottenere i risultati da lì se la query e tutti i parametri sono gli stessi. – Thomas

+0

quindi se sto facendo '" da "+ test.class.getName() + SORT_BY_ID;', come posso decidere se sta colpendo memoria o database, anche come possiamo gestire le impostazioni della cache in hibernate v3.2? – Rachel

+0

@Juha: così ora quando dici che la sessione è sempre attiva, allora HQL dovrebbe ottenere di nuovo i risultati dalla sessione e non colpire nuovamente il database, giusto? – Rachel

1

In pratica se si sta generando query probabilmente stai andando a colpire la base di dati, l'eccezione a questa è se hai memorizzato nella cache la query e parametri.

Le query di ibernazione (sia che si utilizzi Criteria o HQL) restituiranno solo entità dalla cache di sessione (cache di primo livello) se si ottiene con l'@Id.

Al fine di memorizzare nella cache una query è possibile utilizzare la seguente sintassi:

session.createQuery("from X as x").setCacheable(true); 

cura per i commenti:

Una query non è la stessa di un ottenere con @Id. Per ottenere un oggetto dal suo @Id si potrebbe scrivere qualcosa di simile a:

Entity myEntity = sessionFactory.getCurrentSession().get(Entity.class, 1); 
+0

puoi dare un esempio di query in ibernazione che ottengono con '@ Id' – Rachel

+0

Qualcosa di simile usa HQL per recuperare con chiave primaria (@Id) session.createQuery (" da Entity e dove e.id =? ") .setParameter (1, id) –

+0

Questo non colpirà la cache della sessione. Stai creando una query che ignorerà la cache della sessione e passerà direttamente al database. Se vuoi recuperare per @Id usa Carica o Ottieni nella sessione. –

Problemi correlati