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