2010-02-05 12 views
21

Desidero eseguire un JOINT OUTER SINISTRO tra due tabelle utilizzando l'API Criteria. Tutto quello che ho potuto trovare nella documentazione di Hibernate è questo metodo:(Lazy) LEFT OUTER JOIN che utilizza l'API Hibernate Criteria

Criteria criteria = this.crudService 
      .initializeCriteria(Applicant.class) 
      .setFetchMode("products", FetchMode.JOIN) 
      .createAlias("products", "product"); 

Tuttavia, questa operazione esegue un inner join o partecipare a un esterno destro, a causa del numero di risultati che restituisce.

Voglio anche che il mio join sia Lazy. Come posso fare questo?

Cheers!

AGGIORNAMENTO: Sembra che l'utilizzo di alias rende automaticamente il join INNER JOIN. C'è qualcosa nella "storia di fondo" che non ho ancora afferrato. Quindi, nessun alias oggi. Questo mi lascia il problema di applicare restrizioni alle due tabelle, perché entrambi hanno una colonna (o proprietà, se questo è più appropriato) 'nome'.

+2

accettare la risposta già. –

+0

Voglio sapere che la tua referenza di "createAlia() in Hibernate crea un INIZIO INNER" di default. Ho cercato API e non riesco a vederlo. Grazie. – FaithReaper

risposta

0

Un join è nella richiesta SQL. Non può essere pigro.


Con Hibernate, per recuperare pigramente questi dati, basta escluderlo dalla richiesta HQL. Quindi, quando accedi ai getter della tua entità (se la tua Sessione è ancora aperta), verrà caricata automaticamente (non devi scrivere quella parte della richiesta).

+0

Scusa, non ho capito. Forse dovrei riformulare: voglio avere un OUTER JOIN LEFT, ma voglio anche che i dati vengano effettivamente recuperati solo quando necessario (viene chiamato il getter appropriato). La pigrizia (o il desiderio) è in qualche modo connessa con il tipo di SQL JOIN che si verifica? –

+0

La pigrizia può essere realizzata con oggetti, ma non con una richiesta SQL. Una richiesta viene eseguita una volta completamente, non è progettata in modo che parte della richiesta venga eseguita in un secondo momento, se necessario! – KLE

+0

In HQL scrivo LEFT OUTER JOIN FETCH. Quindi, presumibilmente una query HQL corrisponde a molte SQL, che vengono eseguite quando necessario? Ad ogni modo, pigramente o no, come posso fare un LEFT OUTER JOIN? E non in HQL, usando l'API dei criteri. Saluti! –

34

Se avete bisogno di sinistra unirsi in tavola prodotti basta fare:

..... CREATEALIAS ("prodotti", "prodotto", Criteria.LEFT_JOIN);

+0

davvero semplice e utile, grazie mille! – Sllouyssgort

+1

Deprecato ora, usa la risposta di Ankit – jlars62

20

L'API di risposta di Sdavids è deprecated ora. La sua versione aggiornata è

.... CREATEALIAS ("dipendente", "emp", JoinType.LEFT_OUTER_JOIN)

+0

Grazie. Mi aiuta a eliminare l'uso dell'API deprecata –