jump to navigation

HQL – Nhibernet – Castle Record ( Uso de alias en consultas) March 22, 2010

Posted by oscarlama in .NET, 1, Arquitectura, coding, Tips.
Tags: , , , ,
trackback

Que tal a todos,

Este es mi primer post, y quiero compartir con ustedes algo que quizás ya más de alguno vio.

Es la desaparición del uso de “alias” de SQL en el nuevo lenguaje HQL (Hibernate Query Language. El proyecto en el cual estoy trabajando tiene tecnología Nhibernet con Castle Record.

El tema surgio cuando necesitaba obtener una columna sumarizada  de  mi consulta a la Base Datos, si bien es cierto se puede realizar en la query HQL, no es trivial el posterior mapeo con el control gridView.

Realizando una pequeña investigción en la Internet, me encontré que no se considero el uso de alias, para algunos fue algo que se debió incluir y para otros no. El tema es que segun fuentes informales esta funcionalidad se incorporará en las futuras versiones.

Bueno volviendo a nuestro problema, encontré 3 posibles soluciones que compartiré con ustedes:

Caso 1)
Con HQL podes agregar campos calculados en la clausula “select” solo si el calculo está adentro de una función (es un tema del parser actual).
Eso significa que tu select luciría algo así:
select shop, cast(p.Price * shop.Quantity, double) from ShoppingCart shop join shop.Products p where shop.Cartguid = :cart
La respuesta de esa select es un List de List. La list interna tiene dos elemento el primero es shop y el segundo el el calculo.
Para transformarla en una List de un solo tipo de obj (digamos shopCalc) deberás usar un especifico ResultTransformer.
Toda esta historieta es valida solo y exclusivamente si usas la versión SVN de NH.

Caso 2)
Mapeo de objeto usando el tag <formula> de la property. El tag <formula> sirve exactamente para eso; con el le estas diciendo a NH que ese campo es algo que no tiene persistencia si no que lo calcula el RDBMS y por lo tanto NH no le presta mucha atención (o por lo menos no debería causar problema, si lo causa es seguramente un BUG).
El valore del tag <formula> es una expresión SQL (subrayo SQL).
El tag formula está disponible ya en la 1.2.0GA.

Caso 3)
Usando los tag <insert> y <update> a false (insert=”false” update=”false”)
Los tag se aplican a una property de una clase y sirven para decirle a NH de despreocuparse de ese campo sea cuando hace el insert que cuando hace el update de esa clase. Los tag <insert> y <update> están disponible desde mucho tiempo y seguramente en la 1.2.0GA. Cargando

Personalmente yo utilicé la del caso 2),  para mi caso en particular necesitaba obtener la diferencia entre dos columnas de tipo Datetime de la Base Datos. El código para crear dicha propiedad virtual es el siguiente:

[Property(Formula = " DateDiff(hour,StartTimeLog,getdate())")]
public virtual string OpenLogHours { get; set; }

Espero que les sirva este articulo.

Saludos !!

Oscar.

Advertisement

Comments»

No comments yet — be the first.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Connecting to %s

Follow

Get every new post delivered to your Inbox.