• 沒有找到結果。

SELECT 语句

在文檔中 1 实体 (頁 96-100)

3  查询语言

3.8  SELECT 语句

SELECT 语句用于声明查询的结果。SELECT 语句可以返回多个值。

SELECT 语句可以包含一到多个下面的元素:单值变量或一个指向实体抽象 Schema 的单值标识变量,单值路径表达式,合计选择表达式和构造器表达式。

SELECT 的语法如下:

select_clause ::=SELECT [DISTINCT] select_expression {, select_expression}*

select_expression ::=

single_valued_path_expression | aggregate_expression |

identification_variable |

OBJECT(identification_variable)|

constructor_expression constructor_expression ::=

NEWconstructor_name( constructor_item {, constructor_item}*)

constructor_item ::= single_valued_path_expression | aggregate_expression aggregate_expression ::=

{AVG |MAX |MIN |SUM }([DISTINCT] state_field_path_expression) | COUNT ([DISTINCT] identification_variable | state_field_path_expression | single_valued_association_path_expression)

例如:

SELECT c.id, c.status

FROM Customer c JOIN c.orders o WHERE o.count > 100

注意,SELECT 语句必须被指定只返回单值表达式。下面的语句就是无效的:

SELECT o.lineItems FROM Order AS o

DISTINCT 关键字用于去除重复的查询结果。如果没有指定 DISTINCT,则 不去掉重复值。

在 SELECT 语句中独立的标识变量可以不使用 OBJECT 操作限定。SELECT 语句不必使用 OBJECT 操作符去限定路径表达式。 SELECT 语句内使用多个 select_expressions 时,查询结果是 Object[]类型,并且 在结果数组中元素的顺序和这些表达式在 SELECZT 语句中指定的顺序一致,同

时类型和 select_expressions 的类型相对应。

Select_expressions 的结果类型如下:

z 是 一 个 single_valued_path_expression , 它 是 一 个 state_field_path_expression。它的结果是一个对象,这个对象的类型和实 体的状态字段的类型一致。如果这个状态字段的类型是原始类型,那么 返回对应的对象类型。

z 是 一 个 single_valued_path_expression , 它 是 一 个 single_valued_associate_path_expression。它的结果是一个实体对象,这 个对象的类型和实体对象的关系字段的类型或关系字段的子类型,这个 类型由 O/R 映射确定。

z 是一个 Identification_variable 的结果类型。这个类型是标识变量对应的 实体类型或它的子类型,由 O/R 映射确定。

z 是一个 aggreate_expression 的结果类型,这个类型在 3.8.4 章节中描述。

z 是一个 consturctor_expression 的结果类型,这个类型是类的构造器的类 型。构造器内的参数的类型根据上述规则确定。

3.8.2 SELECT 语句内的构造器表达式

可以在 SELECT 列表内使用构造器,以便能一个或多个 java 实例。这个类 可以不是实体或可以和数据库没有映射。但是,构造器名称必须是全称。

如果在 SELECT NEW 语句内使用实体类的名称,则查询的结果中实体实例 的状态是 new。

SELECT NEW com.acme.example.CustomerDetails(c.id, c.status, o.count) FROM Customer c JOIN c.orders o

WHERE o.count > 100

3.8.3 查询结果内的 Null 值

如果与关联字段或状态字段相对应的查询结果值是 null,那么查询方法的返

回值就是 null。IS NOT NULL 指令用于从查询结果内去除这些 null 值。

在 SELECT 语句内可以使用以下合计函数:AVG,COUNT,MAX,MIN,

SUM。

z 当状态字段是整型(不是 BigInteger)时,SUM 返回 Long;当状态字段 是浮点类型时,SUM 返回 Double;当状态字段类型是 BigInteger 时,

SUM 返回 BigInteger;当状态字段类型是 BigDecimal 时,SUM 返回 BigDecimal。

如果使用 SUM,AVG,MAX 或 MIN,但没有参数值,那么合计函数的结 果就是 NULL。

如果使用 COUNT,但没有参数值,那么合计的结果就是 0.

可以在合计函数的参数前加关键字 DISTINCT 来指定在合计之前去除重复 值。(注:可以在 MAX 或 MIN 中使用 DISTINCT,但不影响结果)

在执行合计函数之前会将 Null 值去除,无论是否使用 DISTINCT 关键字。

3.8.5 例子

下面的例子返回平均的的订单数量:

SELECT AVG(o.quantity) FROM Order o

下面的查询返回 John Smith 订购的所有物品的总金额:

SELECT SUM(l.price)

FROM Order o JOIN o.lineItems l JOIN o.customer c WHERE c.lastname = ‘Smith’ AND c.firstname = ‘John’

下面的查询返回订单总数:

SELECT COUNT(o) FROM Order o

下面的查询计算 John Smith 的订单中所有给定价格的物品数量:

SELECT COUNT(l.price)

FROM Order o JOIN o.lineItems l JOIN o.customer c

WHERE c.lastname = ‘Smith’ AND c.firstname = ‘John’

注意:上面的查询等价于:

SELECT COUNT(l)

FROM Order o JOIN o.lineItems l JOIN o.customer c

WHERE c.lastname = ‘Smith’ AND c.firstname = ‘John’

AND l.price IS NOT NULL

在文檔中 1 实体 (頁 96-100)