2010-02-12 13 views
13

sono possibili con i criteri di Hibernate?I criteri di sospensione e il join multiplo

select A.something, B.something, C.something, D.something 
    from A JOIN B on A.id = B.id_fk 
      JOIN C ON B.id = C.id_fk 
      JOIN D ON C.id = D.id_fk; 
+0

http://stackoverflow.com/questions/8726396/hibernate-criteria-join-with-3-tables link qui sopra menzionato può aiutare. –

risposta

17

ho avuto esattamente lo stesso problema, ed è stato in grado di risolvere in questo modo:

return criteria.createCriteria(A.class) 
       .createCriteria("b", "join_between_a_b") 
       .createCriteria("c", "join_between_b_c") 
       .createCriteria("d", "join_between_c_d") 
       .add(Restrictions.eq("some_field_of_D", someValue)); 

Nota: "b", "c" e "d" nel codice di cui sopra si riferiscono a nomi degli attributi in A, B e C classi, corrispondente (classe A ha attributo b e così via).

Per questa soluzione non è nemmeno necessario avere i parametri lazy e fetch da impostare nel numero A.hbm.xml.

+0

Per quanto riguarda il seguente SQL: selezionare A.columnA1, B.columnB1, C.columnC1 da Un inner join B su A.fk_id = B.id inner join C su C.fk_id = B.id? – maximilianus

+0

Per favore apri una domanda a parte per questo. – mindas

1

Provare a impostare la modalità di recupero nei criteri, come:

criteria.setFetchMode(..., FetchMode.EAGER) 

Questo crea una query join. È possibile trovare ulteriori dettagli here.

2

Ci sono alcuni buoni esempi nello Hibernate Reference material che mostrano di usare setFetchMode per recuperare associazioni con un join esterno.

Un esempio è:

List books = sess.createCriteria(Book.class) 
.setFetchMode("chapters", FetchMode.EAGER) 
.setFetchMode("reviews", FetchMode.EAGER) 
.list(); 

C'è anche information there about different fetching stragies che può essere utile a voi.

+0

In realtà questo non ha funzionato per me, ho dovuto farlo come nella risposta che ho postato. Potrebbe essere perché avevo un criterio in più sul 'D'. – mindas

0

Sì, infatti ci sono diversi modi per farlo:

  1. Quando la mappatura dell'associazione, impostare la sua pigrizia su false e il suo modo di unirsi recupero. Questo influenzerà tutte le richieste di criteri.
  2. Utilizzare setFetchMode come specificato dalle altre risposte.
  3. Utilizzare criteria.createAlias ​​(o createCriteria). Ciò consente inoltre di limitare ulteriormente le righe che si desidera unire.
Problemi correlati