criteria o hql

13 views
Skip to first unread message

Gustavo Ringel

unread,
Jun 25, 2008, 4:34:33 AM6/25/08
to nhibernate-hispano
Hi, hoy tuve que cambiar una consulta que estaba en criteria escrita por un programador que trabajo conmigo. Como aca se han dado varias veces que gente habla de usar mas bien criteria por alguna razon, es un buen examen para la vista decidir que es mejor.
 
Las 2 razones por las que la cambie:
 
1) La consulta no es dinamica o sea que no obtengo ningun beneficio por armar un criteria
2) La consulta en criteria es dificil de entender
3) En tiempo de ejecucion NHibernate me va a decir si por ejemplo bag.NextAction no existe. El criteria solo fallara al llegar al test o al llegar en ejecucion a la consulta especifica.
 
Aca va la consulta en criteria (usando Or que no estoy seguro que estuviera en NH 1.2.1, alla era mas feo todavia Disjunction)
 
    Expression.Eq(Bag.Properties.Workstation, workstation),
    Expression.IsNotNull(Bag.Properties.NextAction),
    Expression.IsNull(Bag.Properties.PreviousAction),
    Expression.Or
        (Expression.Eq(Bag.Properties.RiskLevel, nonSelecteeRiskLevel),
        (Expression.IsNull(Bag.Properties.RiskLevel)))
 
y aca en HQL
 
from Bag bag
where bag.Workstation = :workstation
and bag.NextAction is not null
and bag.PreviousAction is null
and (bag.RiskLevel is null or bag.RiskLevel = :risklevel)
 
Bueno, no se que opinan ustedes...para mi en este caso Criteria es una demostracion de cuan poco flexible es la sintaxis de C# para escribir algo sencillo.
 
Gustavo.

Jose Ramirez

unread,
Jun 25, 2008, 11:39:37 AM6/25/08
to NHibernat...@googlegroups.com
Hola:
No es que defienda Criteria (de hecho hace poco me peque contra la pared con ciertas limitaciones que tiene) pero para consultas sensillas como esa, si usas el NHibernate Query Generator  te quedaria algo asi:
 
Where.Properties.Workstation == workstation &&
Where.Bag.NextAction != null &&
Where.Bag.Properties.PreviousAction == null &&
(Where.Bag.RiskLevel == null || Where.Bag.RiskLevel == risklevel)
 
Bastante legible y con compile-time checking.
 
saludos
--
Jose Ramirez

Fabio Maulo

unread,
Jun 25, 2008, 12:09:49 PM6/25/08
to NHibernat...@googlegroups.com
No hay que defender nada...
NH, actualmente, tiene 3 forma de hacer query OO:
HQL
Criteria
SQL (NH style)

Cualquiera es admitida. Creo que el post de Gustavo se debe a que hay programadores que se ostinan a usar Criteria por cuestiones que no se entienden; tipo: "custión de estilo", "me lo impusieron", "me gusta mas" etc.

Tenes varios destornilladores y cuando tenes que elegir uno lo que te viene en la cabeza no es el "estilo" o cual mas te gusta: elegí lo que es mas apropiado para el tornillo que tenes enfrente.

Lo mismo vale para las tres formas de hacer query sobre objetos que NH brinda (hasta el momento son 3).

Espero haber entendido bien el espiritu de Gustavo.
Bye.
Fabio Maulo.
--
Fabio Maulo

Gustavo Ringel

unread,
Jun 25, 2008, 1:31:24 PM6/25/08
to NHibernat...@googlegroups.com
El espiritu es bastante parecido a lo que Fabi puso.
 
Respecto a la consulta con Query Generator, tenes que pasar de una fluent interface a un criteria de un criteria te comila el query y ejecuta cada vez, que pasa si tenes que hacer la misma query por segundo 24 horas como en mi caso? 
 
En HQL me la compila la primera vez, y luego se ejecuta todas las veces que necesito...si quiero llegar a hacer cache para que por los proximos minutos a la base puedo (en una consulta read-only que se hace mucho es recomendable)
 
Es decir, tengo algo cosido para HQL...uso HQL...tengo algo dinamico uso criteria.
 
El enfoque de usar el fluent API de Ayende para abstraer criteria es interesante, soluciona algunos problemas de sintaxis realmente pero no el problema de fondo de cuando usar criteria o HQL.
 
Por cierto de tu experiencia == null lo sabe traducir a Expression.isnull y no a Expression.Eq(prop, null) ? supongo que si habra pensado en eso...pero sino no anda.
 
Gustavo
 
2008/6/25 Fabio Maulo <fabio...@gmail.com>:
Reply all
Reply to author
Forward
0 new messages