三)EJBQL的提高
EJB 2.1也包括两项对于EJBQL的提高,即order by语句的加入和一些新函数。
1、order by语句
以前的EJB规格描述中并没有包含order by语句,而在EJB 2.1中,EJBQL已经开始支持order by语句的应用了。比如说开发人员可以设计一个数据库用户信息查询,并将查询结果按照用户的系统ID排序:
SELECT OBJECT(I)
FROM Users as I
ORDER BY UID
order by语句通常会写在EJB远程或本地接口的查找(finder)或选择(select)语句中。通常来说在order by语句的标识符(identifier)都是路径表达式(path expression),并以容器管理的持久性变量结束。这里需要说明的是,order by语句只能应用于相关ejb的容器管理的持久性变量。在order by语句中,开发人员也可以使用DESC或ASC来指定排列结果时下降或上升的次序,其中上升次序是缺省值。
开发人员也可以在select方法中,即选出持久性变量时使用order by语句。在下面的例子中,该查询选出了具有特定住址的用户,并按照姓名排序:
SELECT DISTINCT I.customer.name
FROM Customer as I
WHERE I.city=NanJing
ORDER BY I.customer.name
当一个EJBQL查询选出持续性变量时,order by值应用于在该选出语句(select)出现的持续性变量。比如说,在上例中,开发人员无法先选出用户的姓名,而是使用用户的年龄进行排序。
2.新功能
新的EJBQL对于where语句和select语句都加入了一些新的函数。在where语句中,除了已有的concat,substring,locate,length,abs和sqrt函数,EJB2.1加入了mod函数。
EJB 2.1也同时向select语句中加入了5个新的集合类函数:AVG,COUNT,MAX,MIN和SUM,这些函数的功能都和SQL-92中相应的定义类似。不同的是,AVG和SUM只作用于数字类型,而COUNT,MAX和MIN函数则作用于任意一个容器管理的持久性变量,包括日期类型和字符串类型。Count则可以应用于一个容器管理的持久性变量或是EJB标识符。
比方说,我们可以定义一个查询,以得到所有住在南京的用户。这里COUNT函数直接地作用在标识符上,而无需OBJECT()操作:
SELECT COUNT(C)
FROM Customer as C
WHERE C.city=NanJing
下面的例子中,我们可以得到用户工资的总和:
SELECT SUM(C.totalsalary)
FROM Customer as C
WHERE C.city=NanJing
以上我们简要地介绍了EJB 2.1中的新特性,包括Web服务、消息驱动bean和 EJBQL等方面的提高,有兴趣的读者也可以参照最新的EJB规范描述来进一步研究和实践。
作者:务实,多年从事J2EE网站及应用系统项目的开发和应用。
