Cuál es la diferencia de .createCriteria() y .setFetchMode()

Que tal compas, alguno de ustedes podría decirme cual es la diferencia, ventajas y desventajas entre usar los criterios ya mencionados y claro cual recomendarían usar.

createCriteria:
 

setFetchMode:
 

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de ezamudio

en ese caso, nada

varios métodos de Criteria devuelven Criteria para poder encadenarlos como muestras. El segundo Criteria tiene puesto JOIN en fetchMode para la relación  , de modo que se va a traer los grupos de cada usuario en el mismo fetch, por medio de un outer join. Si le pusieras modo SELECT no se trae los grupos en el mismo fetch. Esto sirve para modificar los defaults configurados para las relaciones hacia otras entidades; si en la definición de la entidad Usuario se define que la relación hacia la entidad Grupo es lazy entonces tu primer Criteria solamente va a traer Usuarios y cuando uno de esos le pidas su grupo, irá por él, mientras que el segundo Criteria se va a traer los usuarios junto con sus grupos. La diferencia es importante si quieres leer el grupo de un usuario después de haber cerrado la sesión con la que lo leiste.

En caso que la relación de usuario a grupo esté definida como eager (el default para relaciones a uno) entonces ambos Criteria tienen el mismo efecto.

Imagen de AlexSnake

Oks

Gracias ezamudio, la vdd había buscado en la web que se hace con uno y que se hace con otro y realmente no mencionan una diferencia tangible más que de una la relación entre dos tablas. Y solo por comentar, mi configuración es de la siguiente manera:

 

Supongo que en subquerys o consultas mas complejas debera tener un impacto mas grande el usuar uno ú otro.

Imagen de ezamudio

es igual

Tienes lazy=false de modo que es lo mismo usar cualquiera de los dos Criteria. Y pues un outer join no te va a degradar mucho tu performance, si la base de datos tiene definida la llave foránea para unir ambas tablas (Grupo y Usuario).

La diferencia es más importante de Grupo a Usuario; es mejor definir lazy=true en la relación de Grupo a Usuario para que al leer grupos no se lean sus usuarios de inmediato. La desventaja es que para leer los usuarios de un grupo necesitas mantener la sesión abierta (donde leíste al Grupo) o si ya la cerraste, re-asociar el Grupo con una sesión abierta antes de obtener sus usuarios. Pero la ventaja está en el performance. Y si algun caso de uso te permite traer un solo grupo junto con sus usuarios, puedes ponerle fetchMode JOIN al Criteria que usas para traer el Grupo.

Imagen de AlexSnake

So then...

Ehhmmm no estoy cerrando sesiones.... estoy ocupando la configuración que me indicaste (donde se ocupa proxyInterfaces por cada DAO). Pero cambiare lazy = true. Thanks.