2010-02-12 17 views
13

es posible con los criterios de Hibernate hacerlo?Hibernate Criterios y combinación múltiple

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 Por encima de enlace mencionado puede ayudar. –

Respuesta

17

que han conseguido exactamente el mismo problema, y ​​fue capaz de resolver de esta manera:

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" y "d" en el código de seguridad se refieren a los nombres de atributos en A, B y C clases, correspondientemente (clase A tiene el atributo b y así sucesivamente).

Para esta solución, ni siquiera necesita tener los parámetros lazy y fetch que se configurarán en su A.hbm.xml.

+0

Qué tal para el siguiente SQL: seleccione A.columnA1, B.columnB1, C.columnC1 de A join interna B en A.fk_id = B.id join interno C en C.fk_id = B.id? – maximilianus

+0

Por favor, abra una pregunta separada para esto. – mindas

1

Intente configurar el modo de ir a buscar en sus criterios, como:

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

Esto crea una consulta de unión. Puede encontrar más detalles here.

2

Hay algunos buenos ejemplos en el Hibernate Reference material que muestran el uso de setFetchMode para obtener asociaciones con una combinación externa.

Un ejemplo es:

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

También hay information there about different fetching stragies que pueda ser de utilidad para usted.

+0

En realidad, esto no funcionó para mí, tuve que hacerlo como en la respuesta que he publicado. Podría ser porque tenía un criterio adicional sobre la 'D'. – mindas

0

Sí, de hecho, hay varias maneras de hacer esto:

  1. Cuando la cartografía de la asociación, establecer su pereza en false y su modo de unirse a buscarlo. Esto afectará todas las consultas de criterios.
  2. Use setFetchMode como se detalla en las otras respuestas.
  3. Utilice criteria.createAlias ​​(o createCriteria). Esto también le permite restringir aún más las filas que desea unir.
Cuestiones relacionadas