<ejb-jar> <enterprise-beans> <entity> <ejb-name>hotelEJB</ejb-name> ... <abstract-schema-name>hotelSchemaName</abstract-schema-name> <cmp-field>... ... <query> <query-method> <method-name>findByCity</method-name> <method-params> <method-param>java.lang.String</method-param> </method-params> </query-method> <ejb-ql> <![CDATA[SELECT OBJECT(h) FROM hotelSchemaName AS h WHERE h.city = ?1]]> </ejb-ql> </query> </entity> ... </enterprise-beans> ... </ejb-jar>
蓝色的为EJB-QL 查询,红色的为 <![CDATA[...]]> 为特定的 XML符号,注意必须一直用这种表示方法。
上面是最常用的语法,后面我们会看到更多的语法要素。在这个语法中,可以在FROM 中声明一个或者多个 变量(variables), 在SELECT 和 WHERE 中引用。 注意 abstractSchemaName,,它与 ejb-jar.xml中 entity 标记中声明的一致。
value 可以是一个参数( parameter), 数字(numeric或者字符( string),变量( variable), 变量中的成员( member inside this variable),或者常量(例如 ''Pleasant Inn'', 23, TRUE).。每个查询有一个返回类型( return type)。 Values and return types can be of 6 different data types.
SELECT OBJECT(h) FROM hotelSchemaName AS h返回所有的 hotels.SELECT OBJECT(h) FROM hotelSchemaName AS h WHERE h.city = ''San Diego''返回在 San Diego的 hotels .在 SELECT语句中,关键字DISTINCT 可以避免查询出现重复的值。事实上,对于finder方法,由于其返回实体Bean,而实体Bean本身不会重复(因为其主关键字不同)。 但是对于 select 方法,可能就会有重复。
SELECT [DISTINCT] value FROM abstractSchemaName [AS] variable [WHERE ...]
后边我们会讨论 range variables
SELECT [DISTINCT] OBJECT(variable) FROM abstractSchemaName [AS] variable, IN (variable.collectionMember) [AS] variable2 [WHERE ...]
(注意这里的IN操作与WHERE中的不同),你可以在WHERE中 使用新定义的变量 ,就像一般的变量一样。
SELECT DISTINCT OBJECT(h) FROM hotelSchemaName AS h, IN (h.rooms) AS r WHERE r.smoking = TRUE (返回所有不吸烟的房间)
WebLogic Server 6.1 : range变量语法 在WLS是不同的。下面是一个例子 : SELECT DISTINCT OBJECT(h) FROM hotelSchemaName AS h, r IN h.rooms WHERE r.smoking = TRUE
abstract public Hotel findByCityAndState(String city, String state);
你可以用?1表示参数city, ?2表示state,EJB-QL如下所示:
SELECT OBJECT(h) FROM hotelSchemaName AS h WHERE h.city = ?1 AND h.state = ?2
... WHERE (h.owner.name = ''Harry'' AND h.capacity > 100) OR (h.owner.name = ''Joe'' AND h.capacity > 200)
下面是这些操作符的详细列表
... WHERE NOT (h.capacity > 100) 等价于: ... WHERE (h.capacity <= 100)
... WHERE h.state LIKE ''K%'' (将返回在 Kentucky 或者 Kansas的hotel)
... WHERE h.owner.name LIKE ''J__'' (两个下划线 ''_'') (将返回 Joe拥有的hotel)
... WHERE h.id LIKE ''A_1%'' ESCAPE '''' (将返回以 "A_1"开头的hotel。这里下划线 "_" 被反斜杠 ""置换掉)
... WHERE h.capacity BETWEEN 100 AND 200
... WHERE h.owner IS NULL (返回owner为空的hotel)
在 WHERE中,检查一个字符串是否在一系列的字符串之中。 这与 FROM中的IN操作不同。
... WHERE h.state IN (''Ohio'', ''Texas'', ?1)
... WHERE ?1 MEMBER OF h.rooms (返回包含某一个的房间的 hotel )
... WHERE h.owner.name = ''Harry'' ... WHERE h.owner.name <> ''Joe''
... WHERE h.capacity >= 100
... WHERE h.rooms IS EMPTY (返回没有房间的 hotels)
SELECT OBJECT(h) FROM hotelSchemaName h WHERE h.owner = ?1 (这里的object 为 h, h.owner 和 ?1)
SELECT OBJECT(h) FROM hotelSchemaName h WHERE ?1 MEMBER OF h.rooms (Collection 为 h.rooms)
SELECT OBJECT(h) FROM hotelSchemaName h, IN h.rooms AS r WHERE r = ?1 ( Collections 为 r 和 h.rooms)
SELECT h FROM hotelSchemaName (返回所有hotel的Collection )
... WHERE h.owner.name = ''Harry'' (String为 h.owner.name (变量) 和 ''Harry'' (常量))
... WHERE h.owner.name = ''O''''Sullivan'' (常量)
13 -16 17.2 1.98E4 45 + 12.1 (自动转换为 float)
... WHERE reservation.arrivalDate = ?1 (这里的 date是成员变量 arrivalDate 和参数)
... WHERE reservation.arrivalDate < ??????? (这里的值需要计算)
... WHERE room.smoking = TRUE
... WHERE LENGTH(h.owner.name) > 3
... WHERE LOCATE(h.owner.name, ''rr'') = 2 (Harry''s hotel 会被返回)
... WHERE LOCATE(h.owner.name, ''rr'', 3) >= 0 (从位置 3开始, Harry''s hotel 将不会被返回)
SELECT CONCAT (CONCAT( h.owner.name, '', the owner of ''), h.name) FROM hotelSchemaName AS h (select方法返回所有的hotel的所有owner,返回值为一个字符类型的集合)
... WHERE SUBSTRING(h.owner.name, 0, 2) = ''Jo'' (将会返回Joseph, Joe, 等, 等价于h.owner.name LIKE ''Jo%'')
SELECT ABS(a.balance) FROM accountSchemaName AS a WHERE a.balance < 0 (select方法将会返回所有的资产为负的记录,但返回值为正的)
SELECT OBJECT(a) FROM accountSchemaName AS a WHERE SQRT(a.balance) = 2 (返回资产为4的账号)
SELECT OBJECT(h) FROM hotelSchemaName AS h WHERE h.capacity / 2 >= ?1 SELECT OBJECT(h) FROM hotelSchemaName AS h WHERE h.capacity >= ?1 * 2 (上面的两个查询都是返回指定容量双倍的hotel)
SELECT h.capacity - 10 FROM hotelSchemaName AS h (返回 hotel的容量 ,返回值会减去10)