实体Bean为底层数据库提供了一个面向对象的抽象,同时它还能够创建一些业务方法,通过这些方法可以操作实体Bean中包含的数据。为了提高数据操作的方便性以及效率,J2EE提供了一种类SQL的语言EJB Query Language,缩写为EJB-QL,这就像我们在Hibernate中所使用的HQL(Hibernate Query Language)一样。通过利用EJB-QL,我们可以在实体bean的方法中插入与SQL语法类似的查询,EJB-QL查询的结果通常都是实体bean的引用,可以直接对其进行操作,这样就可以同时利用到SQL和面向对象技术的优点。
在实体bean中使用EJB-QL有两种方式:在实体bean的Home接口中使用EJB-QL find方法和在实体bean的Bean类中使用EJB-QL select方法,其中select方法只能被bean类中的其它方法调用。这里首先只介绍在实体bean的Home接口中使用Find方法。
假设有一个EJB应用,它里面包含一个名称为Planet的实体bean,现在我们想在它的Home接口中声明这样一个find方法:它的功能是返回具有指定数量卫星的所有行星。这个方法可能会如下所示:public Collection findByNumMoons(int moons) throws FinderException;它对应的EJB-QL可能是这样的一些类SQL语言:
SELECT OBJECT(p)
FROM Planet p
WHERE p.numMoons = ?1
分析下上面这个类SQL语言,?1是用于传递参数的,就像我们在Java中使用PreparedStatement时用问号来指定参数一样。SELECT OBJECT表明这个查询的返回结果是一个实体bean的引用或者是包含了多个实体bean引用的集合。而(p)则表明了所返回实体bean的类型,它是通过后面的Planet p联系起来的,这里它表明所返回的实体bean所对应的抽象schema的名字是Planet。当然find方法也可以只返回一个单独的实体bean的引用,而不是一个集合。
补充一下,关于find方法和select方法的差别,主要有如下四点:
● find方法都是声明在实体bean的home接口中,而select方法则是申明在实体bean的bean类中
● find方法对其它bean而言是可见的,而select方法则只能被同一个实体bean中的方法所访问
● find方法只能返回实体bean的bean接口引用或者这些引用的一个集合,而select方法除此之外还能够返回CMP域的值和这些值的集合
● find方法都是findXxxx()的形式,而select方法则都是ejbSelectXxxx()的形式