Las características de rendimiento entre ICriteria y HQL puede variar a poco (no sé acerca QueryOver) por una sencilla razón.
Las consultas de ICriteria intentarán implementar sus estrategias de recuperación según lo definido en su asignación, mientras que HQL considera por defecto Lazy y depende de sus declaraciones de unión dentro de su consulta para definir lo que se busca con impaciencia o no.
Además, ICriteria depende del mapeo para el paso de parámetros, mientras que HQL permite tipos de parámetros explícitos, p. IQuery.SetInt32 ("fooParam", 5);
Lo que realmente importa es la enchufabilidad de consultas ICriteria (ver ICriteria.CreateCriteria(). CreateCriteria(), etc.) donde el motor NH tendrá que resolver el ICriteria y tratar de generar el SQL más válida.
En el lado opuesto es probablemente más fácil de predecir si una consulta HQL producirá resultados consistentes y, por lo tanto, facilita el uso de QueryCache.
De cualquier forma, la configuración se genera una vez con la creación de ISessionFactory y las definiciones de asignación y lo que no está en la memoria, por lo que el rendimiento es bueno.
La generación de SQL real se realiza de forma diferente entre los dos y esa es la razón por la que una utilidad para ICriteria -> HQL no existe.
Al final, mi experiencia me ha demostrado que el rendimiento entre los 2 es probablemente el mismo dar o tomar algunos milisegundos.
Como nota al margen, declarar tanto como sea posible en la asignación dará como resultado una generación sql más concisa así como la operación NHibernate, por ejemplo, para la asignación de propiedades de cadena Length
en .hbm.xml resultará en una cadena de comprobación NHibernate longitudes antes de ir a la base de datos.
Muy agradable. Veamos lo que dicen los demás sobre QueryOver. – mynkow