介绍
Summerhill 医院的人们对应用程序的功能非常满意。他们对您交付应用程序的速度感到非常兴奋,以至于他们想出了一个他们希望您实施的新用户故事。虽然这不是最初设计的一部分,但通过敏捷,您可以适应它。他们想查看还有多少班次尚未分配,以便他们知道一周是否已完全计划好。您已经查看了各种可能性,并且似乎 XPath 在这里不是正确的解决方案,因为它不允许您一次聚合来自多个实体的数据。幸运的是,西门子Mendix 提供了另一种可以帮助您的数据选择语言,称为对象查询语言 (OQL)。
当您编写 XPath 查询时,您的查询会自动转换为 OQL。OQL 是您的 XPath 和发送到数据库的 SQL 之间的中间体。让我们看一个例子。
想象一下,您想选择数据库中的所有医生。使用 XPath,您的查询将如下所示:
//UserManager.Employee[Jobtitle = "Doctor"]\
(Schema: Title, Firstname, Lastname, Jobtitle)
请记住,当您将此查询放入 Mendix Studio Pro 时,您将编写以下查询:
[Jobtitle = "Doctor"]
这是因为 Mendix Studio Pro 会自动为您添加 //UserManager.Employee 部分。
Mendix 解释 XPath 查询并生成以下 OQL 查询:
SELECT Title, Firstname, Lastname, Jobtitle
FROM UserManager.Employee
WHERE Jobtitle = "Doctor"
您可以看到 OQL 与 SQL 相比如何更短。您还可以看到 OQL 看起来很像 SQL。这是因为它是 SQL 的抽象,适用于 西门子Mendix 使用的所有数据库。现在您已经对 OQL 有了基本的了解,是时候看看它支持的特性了。
OQL 语法
语法类似于 SQL,并支持您习惯使用的许多功能。让我们详细看看最重要的:
SELEC
使用 SELECT 子句,您可以从实体中选择特定属性,就像从数据库中选择列一样。您可以使用关键字 DISTINCT 从结果集中删除重复行。 还支持来自FROM的实体的别名, 您可以重命名结果集中的列并编写表达式。就像在 SQL 中一样,这可以是一个常量、一个函数,或者是由运算符连接的属性名称、常量和函数的任意组合,或者是一个子查询。要分隔这些表达式,请使用逗号。
SELECT [ DISTINCT ]
{
*
| { entity_name | from_alias }.*
| { expression [ [ AS ] column_alias ] } [ ,...n ]
}
FROM
FROM 子句指定您将从哪个源检索数据。 这可以是一个实体或另一个 OQL 查询。您可以在此处使用别名重命名表。使用实体路径中的关联将实体连接在一起。简单的例子是:
UserManager.Employee/UserManager.Department_Employee/UserManager/Department.
FROM
{
entity_name | ( sub_oql_query )
}
[ [ AS ] from_alias ]
{
{ INNER | { { LEFT | RIGHT | FULL } [ OUTER ] } } JOIN
entity_path [ [ AS ] from_alias ]
ON <constraint>
} [ ,...n ]
这限制了FROM 子句的JOIN 部分中 的指定实体 。只有当前和前面的JOIN元素中的实体和 FROM 别名 可以在约束中使用。
这部分是可选的。 系统会根据指定的 entity_path生成合适的 JOIN条件。
要连接实体,您可以使用 JOIN 子句。Mendix 支持四个 JOINS:
- INNER JOIN – 这是最常见的,也是Mendix 使用的默认JOIN 。 该查询将实体 A 的每一行与实体 B 的每一行进行比较,以查找具有关联并满足JOIN谓词的所有行对。如果满足这些条件,则将 A 和 B 的每对匹配行的列值组合成一个结果行。
[ INNER ] JOIN entity_path [ ON <constraint> ]
- LEFT OUTER JOIN - 类似于INNER JOIN。但是,与INNER JOIN构造相反,查询还将返回实体 A 中与实体 B 不匹配的行。当指定实体 B 的列时,这些列包含这些行的空值。
LEFT [ OUTER ] JOIN entity_path [ ON <constraint> ]
- RIGHT OUTER JOIN – 就像LEFT INNER JOIN一样,这是一个INNER JOIN,其中将返回实体 B 中与实体 A 不匹配的行。当指定实体 A 的列时,这些列包含这些行的空值。
RIGHT [ OUTER ] JOIN entity_path [ ON <constraint> ]
- FULL OUTER JOIN - 执行与 INNER JOIN 类似的连接。但是,与INNER JOIN构造相反,来自不匹配的实体的数据也将被返回。对于这些行,缺失实体的列将包含空值。
但是,与 INNER JOIN 构造相反,来自不匹配的实体的数据也将被返回。对于这些行,缺失实体的列将包含空值。
FULL [ OUTER ] JOIN entity_path [ ON <constraint> ]
WHERE
当您要指定要检索的对象或行时,可以使用带有约束的WHERE子句。 这可以像带有值的简单等号一样简单。如果要构造更复杂的表达式,可以将关联与JOINS结合使用。
WHERE <constraint>
GROUP BY
GROUP BY子句用于根据 特定表达式聚合结果。这允许您压缩表达式中属性具有相同值的行。当您使用 GROUP BY时 ,您需要在 HAVING 子句中指定您的约束。
GROUP BY
expression [ ,...n ]
[HAVING <constraint>]
ORDER BY
您可以通过对SELECT 语句 中返回的一个或多个列 使用 ORDER BY子句来指定排序顺序。 ORDER BY子句中列 的顺序决定了排序完成的顺序,从左到右。当您不使用 SELECT DISTINCT 或 GROUP BY时,您还可以包含未在 SELECT中指定的属性。一个例外是包含 UNION 语句,当使用它时,您只能使用 查询第一部分的SELECT子句中使用的属性。
ORDER BY
{
order_by_expression [ ASC | DESC ]
}
LIMIT
LIMIT子句允许您限制返回到结果 集子集的对象数。您可以指定行数和偏移量。
[ LIMIT number ] [ OFFSET number ]
好了,在第15章,我们就具体来看一下,如何使用OQL来过滤我们的数据。
低代码新手入门系列,快速导航
- 第13章 低代码新手入门系列,西门子Mendix XPath提高应用安全性
- 第12章 低代码新手入门系列,西门子Mendix 设置模块的安全
- 第11章 低代码新手入门系列,西门子Mendix 安全管理
- 第10章 低代码新手入门系列,西门子Mendix XPath数据过滤
- 第9章 低代码新手入门系列,西门子Mendix 微流如何进行Debug?
- 第8章 低代码新手入门系列,西门子Mendix 创建我们的第一个微流
- 第7章 低代码新手入门系列,西门子Mendix 图形逻辑组件,微流
- 第6章 低代码新手入门系列,西门子Mendix UI页面组件
- 第5章 低代码新手入门系列,西门子Mendix页面编辑器
- 第4章 低代码新手入门系列,西门子Mendix领域模型和数据存储
- 第3章 低代码新手入门系列,西门子Mendix面向专业开发者的IDE
- 第2章 低代码新手入门系列,西门子Mendix团队如何进行协作?
- 第1章 低代码新手入门系列,西门子Mendix 平台简介