Dorado 9 : 动态HQL查询(sample-center)

简介

本例代码与页面功能与"简单查询 1"非常类似,请预先了解"简单查询 1"。本例不一样的是,dorado中提供了HibernateHqlDataProvider处理机制,允许开发人员在不定义DAO的情况下,可以直接利用HQL完成数据查询,在某些场景下可以使开发更为简洁,开发效率也大大提升。

使用说明

定义视图私有DataProvider

使用HibernateHqlDataProvider,需要在视图模型中定义一个私有的DataProvider对象:

<DataProvider name="providerOrders" type="hibernateHql">
	<Property name="hql"><![CDATA[from Order where employee.id = 'ACN001']]></Property>
</DataProvider>

我们注意到其中的type需要设置为"hibernateHql",这表示这个私有的DataProvider对象是HibernateHqlDataProvider类型的。HibernateHqlDataProvider类型的dataProvider对象提供了hql属性,便于我们在该属性中定义hql代码。

定义查询参数

上面的hql中employee.id的值被设置为一个固定值,如果我们希望使这个值具有动态性,也就是说允许browser中动态设定employee.id的值,并且可以实现ajax类型的查询效果,则我们可以将hql调整为:

<Property name="hql"><![CDATA[from Order where employee.id = :employeeId]]></Property>

这样设定后我们就可以利用DataSet的查询技术实现ajax的效果处理。

HQL动态组装

在很多情况下,我们希望hql具有动态性,也就是说希望其能根据browser端,操作员输入的查询条件来动态组装hql代码. 在HibernateHqlDataProvider技术中采用了Velocity技术,它直接利用了veloctiy的条件判断语法,从而实现hql的动态组装效果。关于veloctiy的条件判断语法请参考velocity的相关文档(http://velocity.apache.org/docbook/DocBook-Framework-1.0.pdf),此处不详细说明,本例的代码也容易理解:

<Property name="hql"><![CDATA[
from Order
where 1 = 1
#if ($orderDate1)
and orderDate >= :orderDate1
#end
#if ($orderDate2)
and orderDate <= :orderDate2
#end
#if ($customer)
and customer.id = :customer.id
#end
#if ($employee)
and employee.id = :employee.id
#end
]]></Property>