Jakarta EE 编程/EJB-QL
外观
EJB 查询语言用于定义实体 Bean 的查找方法应该返回什么。EJB 1.1 规范没有提供查询实体 Bean 的方法。导致不同的应用程序服务器使用不同的查询语言。当 Sun 发布 EJB 2.0 规范时,它添加了一种查询语言,以便更轻松地查找实体 Bean。
SELECT_CLAUSE FROM_CLAUSE [WHERE_CLAUSE]
必须使用 SELECT_CLAUSE 和 FROM_CLAUSE,但 WHERE_CLAUSE 是可选的。
查找方法用于从存储中返回一个或多个实体。查找方法在实体的主接口中定义。查找方法的返回值是 Bean 的远程接口或实现远程接口的实体 Bean 集合,这些实体 Bean 被找到。
最简单的 EJB 查询是返回给定表中的所有实体的查询。
@ejb.finder signature="Collection findAll()" query="SELECT DISTINCT OBJECT(p) FROM Player p"
如您所见,EJB 查询看起来几乎与标准 SQL 查询相同,尽管它不是表名,而是 EJB 类名,也不是列名,而是 EJB 属性名。唯一的区别是终端 object(o),它等同于:获取给定行的所有列,并将结果转换为实体 Bean 实例。
查看上面的示例。它与上面的查找方法的不同之处在于,它添加了对要返回的球员的条件。
@ejb.finder signature="Collection findByPosition(java.lang.String position)" query="SELECT DISTINCT OBJECT(p) FROM Player p WHERE p.position = ?1"
此查找方法返回所有在参数一中输入的位置上比赛的球员。如果您有多个参数,您可以在查询中使用它们,例如 ?2、?3 等。
当您想使用不同的关系表时,EJB 查询与 SQL 的区别尤其明显。
@ejb.finder signature="Collection findByCity(java.lang.String city)" query="SELECT DISTINCT OBJECT(p) FROM Player p, IN (p.teams) AS t WHERE t.city = ?1"
此查询返回所有球队在参数一中给定的城市比赛的球员。换句话说:返回所有在位于给定城市的球队中比赛的球员。
与查找方法相反,选择方法可能会返回持久字段或其他实体 Bean。因此,可以定义一个返回基本数据类型而不是完整对象的 select 方法。