第14章 低代码新手入门系列,西门子Mendix OQL语法

699 阅读6分钟

介绍

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来过滤我们的数据。

低代码新手入门系列,快速导航