不灭的焱

革命尚未成功,同志仍须努力下载JDK17

作者:Albert.Wen  添加时间:2024-06-16 12:16:33  修改时间:2024-09-08 07:06:49  分类:02.低代码/Mendix  编辑

 

  1. 【Mendix】利用 XPath 进行数据的查询与操作 数据的增删改查
  2. 重点XPath组合查询 (and 、or 、子查询 等关键词应用)
  3. 【SQL调试】查看执行的MySQL语句日志记录

 


 

一、XPath符号(Token)

符号 定义
// 完整的XPath查询总是以标记//开头。这些斜线后面跟着要查询的对象的名称。例如,如果您希望检索所有客户,则查询将类似于以下内容://Customers
. 点用于将模块名称与实体名称分开。例如,如果您希望检索销售模块中的所有客户(对象),则可以使用//Sales.Customer
/ 每当您想引用新的实体或关联时,都会使用斜线。例如,//Sales.Customer/Sales.Customer_Order/Sales.Order。顺序此查询遵循关联Customer_Order上从实体Customer到实体Order的路径。只要域模型中存在可用的潜在关联,就可以通过斜线、实体或关联来扩展查询。
[ ] 约束总是写在方括号之间。例如,//Sales.Customer[TotalAmount > 1000]。受约束的属性为TotalAmount,并且约束>1000。因此,只有花费超过1000欧元的客户才会被查询。
( ) 约束可以用括号分组。有关详细信息,请参见XPath约束

二、XPath运算符(Operators)

1、For XPath Query Constraints

以下运算符可用于Studio Pro和Java代码中的XPath查询约束:

运算符 描述 示例 返回值
= 等于 price = 9.80 true if price is 9.80, false if price is 9.90
!= 不等于 price != 9.80 true if price is 9.90, false if price is 9.80
< 小于 price < 9.80 true if price is 9.70, false if price is 9.80
<= 小于等于 price <= 9.80 true if price is 9.80, false if price is 9.90
> 大于 price > 9.80 true if price is 9.90, false if price is 9.80
>= 大于等于 price >= 9.80 true if price is 9.80, false if price is 9.70
or price = 9.80 or price = 9.70 true if price is 9.80, false if price is 9.60
and price = 9.80 and amount = 1 true if price is 9.80 and amount is 1, false if price is 9.70 and amount is 1, false if price is 9.80 and amount is 2, false if price is 9.70 and amount is 2

2、For Java Code

运算符 描述 示例 返回值
+ 相加 6 + 4 10
- 相减 6 - 4 2
* 相乘 6 * 4 24
div 相除 8 div 4 2

三、XPath函数(Functions)

有两种函数类型。XPath聚合函数只能在Java代码中使用,并且必须包含完整的查询作为参数。XPath约束函数既可以在Java代码中使用,也可以在Studio Pro中使用。在Studio Pro中,您不编写完整的查询,只编写约束。

1、XPath聚合函数:XPath Aggregate Functions

(1) avg

avg()函数 返回其参数的平均值。

此查询返回所有已下订单的平均总价:

avg(//Sales.Order/TotalPrice)

此查询返回名为“Jansen”的客户下的所有订单的平均总价:

avg(//Sales.Order[Sales.Customer_Order/Sales.Customer = 'Jansen']/TotalPrice)

(2) count

count()函数的作用是对包含的查询检索到的所有对象进行计数,并将值作为整数返回。

此查询返回所有已下订单的计数:

count(//Sales.Order)

此查询返回名为“Jansen”的客户下的所有订单的计数:

count(//Sales.Order[Sales.Customer_Order/Sales.Customer/Name = 'Jansen'])

(3) max

max()函数返回其参数的最大值。

max(//Sales.Order/TotalPrice)
max(//Sales.Order[Sales.Customer_Order/Sales.Customer/Name = 'Jansen']/TotalPrice)

(4) min

min()函数返回其参数的最小值。

min(//Sales.Order/TotalPrice)
min(//Sales.Order[Sales.Customer_Order/Sales.Customer/Name = 'Jansen']/TotalPrice)

(5) sum

sum()函数返回其参数的总和。

sum(//Sales.Order/TotalPrice)
sum(//Sales.Order[Sales.Customer_Order/Sales.Customer/Name = 'Jansen']/TotalPrice)

2、XPath约束函数:XPath Constraint Functions

(1) true

函数true()返回布尔值true。

要在XPath查询中使用true或false值,必须调用true()或false()函数,或者用引号将值括起来。

# 此查询返回所有被分类为“金牌客户”的客户:

Studio Pro Java
[IsGoldCustomer = true()] //Sales.Customer[IsGoldCustomer = true()]

(2) false

省略...

(3) not

取反:函数的not()反转参数的含义(以及结果)。

# 此查询返回所有名称不等于“Jansen”的客户:

Studio Pro Java
[not(Name = 'Jansen')]
等同于
[Name != 'Jansen']
 //Sales.Customer[not(Name = 'Jansen')]
等同于
//Sales.Customer[Name != 'Jansen']

# 以下查询返回所有未下过至少一个订单的客户:

Studio Pro Java
[not(Sales.Customer_Order/Sales.Order)] //Sales.Customer[not(Sales.Customer_Order/Sales.Order)]

# 以下查询返回所有没有下过TotalPrice超过30000的订单的客户,包括那些根本没有下过任何订单的客户:

Studio Pro Java
 [not(Sales.Customer_Order/Sales.Order/TotalPrice > 30000)] //Sales.Customer[not(Sales.Customer_Order/Sales.Order/TotalPrice > 30000)]

# 上面的查询返回的结果与下面的查询不同,后者返回所有至少下了一个TotalPrice低于30000的订单的客户,无论他们下的订单数量是否超过30000:

Studio Pro Java
[Sales.Customer_Order/Sales.Order/TotalPrice <= 30000] //Sales.Customer[Sales.Customer_Order/Sales.Order/TotalPrice <= 30000]

例如,如果一个客户下了两个订单——一个15000,一个35000——这个查询将返回这个客户,而not查询则不会。未下任何订单的客户将不会被此查询退回。

(4) length

length()函数的作用是:返回字符串属性或值的长度。

# 此查询返回FirstName为5个或5个以上字符的所有客户:

Studio Pro Java
[length(FirstName) >= 5] //Sales.Customer[length(FirstName) >= 5]

(5) contains

contains()函数测试字符串属性是否包含作为子字符串的特定字符串(不区分大小写)。

# 此查询返回名称中包含字符串an的所有客户:

Studio Pro Java
[contains(Name, 'an')] //Sales.Customer[contains(Name, 'an')]

例如,名称为“Andy”或“Jan”的客户将被返回,因为“an”是这些名称的一部分。

(6) starts-with

starts-with()函数测试字符串属性是否以特定字符串(不区分大小写)作为子字符串开始。

# 此查询返回名称以字符串“Jans”开头的所有客户:

Studio Pro Java
 [starts-with(Name, 'Jans')] //Sales.Customer[starts-with(Name, 'Jans')]

(7) ends-with

ends-with()函数检查字符串属性是否以特定字符串(不区分大小写)作为子字符串结束。

# 此查询返回名称以子字符串sen结尾的所有客户:

Studio Pro Java
[ends-with(Name, 'sen')] //Sales.Customer[ends-with(Name, 'sen')]

(8) year-from-dateTime

year-from-dateTime()函数从Date和time属性中提取年数,以便用于与值进行比较。

语法:

year-from-dateTime ( attribute [, timezone ] )

attribute指定从中提取日期的属性。属性必须为日期和时间类型。

timezone指定用于提取的时区。此参数是可选的,默认为本地时区。它应该是包含IANA时区或“UTC”的字符串文字。不支持GMT偏移时区。

# 此查询返回本地时区(例如“2011-12-30”)中DateAttribute中的年数为“2011”的所有日志:

Studio Pro Java
[year-from-dateTime(DateAttribute) = 2011] //Logging.Log[year-from-dateTime(DateAttribute) = 2011]

# 此查询返回纽约时区中DateAttribute中的年数为“2011”的所有日志(例如,“2011-12-30”):

Studio Pro Java
[year-from-dateTime(DateAttribute, 'America/New_York') = 2011] //Logging.Log[year-from-dateTime(DateAttribute, 'America/New_York') = 2011]

(9) month-from-dateTime

month-from-dateTime()函数从Date和time属性中提取月份值,以便用于与值进行比较。

语法:

month-from-dateTime ( attribute [, timezone ] )

# 此查询返回本地时区中月份值DateAttribute为12(12月)的所有日志(例如,“2011-12-30”):

Studio Pro Java
[month-from-dateTime(DateAttribute) = 12] //Logging.Log[month-from-dateTime(DateAttribute) = 12]

# 此查询返回纽约时区中月份值DateAttribute为12(12月)的所有日志(例如,“2011-12-30”):

Studio Pro Java
[month-from-dateTime(DateAttribute, 'America/New_York') = 12] //Logging.Log[month-from-dateTime(DateAttribute, 'America/New_York') = 12]

(10) day-from-dateTime

day-from-dateTime()函数的作用是从Date和time属性中提取一个月中的日期值,以便与值进行比较。

语法:

day-from-dateTime ( attribute [, timezone ] )

# 此查询返回所有日志,其中DateAttribute是本地时区中一个月的第30天(例如,“2011-12-30”):

Studio Pro Java
[day-from-dateTime(DateAttribute) = 30] //Logging.Log[day-from-dateTime(DateAttribute) = 30]

# 此查询返回所有日志,其中DateAttribute是纽约时区中一个月的第30天(例如,“2011-12-30”):

Studio Pro Java
[day-from-dateTime(DateAttribute, 'America/New_York') = 30] //Logging.Log[day-from-dateTime(DateAttribute, 'America/New_York') = 30]

(11) hours-from-dateTime

hours-from-dateTime()从Date和time属性中提取hours值,以便与值进行比较。

语法:

hours-from-dateTime ( attribute [, timezone ] )

# 此查询返回本地时区中DateAttribute的小时部分为8的所有日志(例如,“2011-12-30 08:00:00”):

Studio Pro Java
 [hours-from-dateTime(DateAttribute) = 8] //Logging.Log[hours-from-dateTime(DateAttribute) = 8]

# 此查询返回纽约时区中DateAttribute的小时部分为8的所有日志(例如,“2011-12-30 08:00:00”):

Studio Pro Java
[hours-from-dateTime(DateAttribute, 'America/New_York') = 8] //Logging.Log[hours-from-dateTime(DateAttribute, 'America/New_York') = 8]

(12)  minutes-from-dateTime

minutes-from-dateTime()从Date和time属性中提取minutes值,以便用于与值进行比较。

// 省略。。。

(13) seconds-from-dateTime

seconds-from-dateTime()函数提取Date和time属性的seconds部分,以便用于与值进行比较。

// 省略。。。

(14) quarter-from-dateTime

quarter-from-dateTime()函数的作用是提取与Date和time属性对应的季度,以便将其与值进行比较。

语法:

day-of-year-from-dateTime ( attribute [, timezone ] )

# 此查询返回DateAttribute位于本地时区第四季度的所有日志(例如“2011-12-30”):

Studio Pro Java
[quarter-from-dateTime(DateAttribute) = 4] //Logging.Log[quarter-from-dateTime(DateAttribute) = 4]

# 此查询返回DateAttribute位于纽约时区第四季度的所有日志(例如“2011-12-30”):

Studio Pro Java
[quarter-from-dateTime(DateAttribute, 'America/New_York') = 4] //Logging.Log[quarter-from-dateTime(DateAttribute, 'America/New_York') = 4]

(15) day-of-year-from-dateTime

day-of-year-from-dateTime()函数的作用是从Date和time属性中提取一年中的日期,以便与值进行比较。数值范围从1(1月1日)到366(由于闰年)。

语法:

day-of-year-from-dateTime ( attribute [, timezone ] )

#此查询返回本地时区中DateAttribute中日期为40的所有日志(例如“2011-02-09”和“2012-02-09”):

Studio Pro Java
[day-of-year-from-dateTime(DateAttribute) = 40] //Logging.Log[day-of-year-from-dateTime(DateAttribute) = 40]

(16)  week-from-dateTime

week-from-dateTime()函数从Date和time属性中提取周数(以年为单位),以便用于与值进行比较。值的范围从1到53。

语法:

week-from-dateTime ( attribute [, timezone ] )

# 此查询返回本地时区中日期DateAttribute位于一年中第二周的所有日志(例如,“2011-01-13”):

Studio Pro Java
[week-from-dateTime(DateAttribute) = 2] //Logging.Log[week-from-dateTime(DateAttribute) = 2]

# 此查询返回日期DateAttribute位于纽约时区一年中第二周的所有日志(例如,“2011-01-13”):

Studio Pro Java
[week-from-dateTime(DateAttribute, 'America/New_York') = 2] //Logging.Log[week-from-dateTime(DateAttribute, 'America/New_York') = 2]

(17) weekday-from-dateTime

weekday-from-dateTime()函数从Date和time属性中提取一周中的哪一天(作为数字),以便用于与值进行比较。对于本地运行和使用PostgreSQL数据库(如Mendix Cloud中使用的数据库)进行部署,其值范围为1到7(1=周日,7=周六)。

语法:

weekday-from-dateTime ( attribute [, timezone ] )

# 此查询返回本地时区中DateAttribute中的星期几为6的所有日志(星期五,对于本地运行的应用程序或使用PostgreSQL数据库的应用程序):

Studio Pro Java
[weekday-from-dateTime(DateAttribute) = 6] //Logging.Log[weekday-from-dateTime(DateAttribute) = 6]

# 此查询返回纽约时区中DateAttribute中的星期几为6的所有日志(星期五,对于本地运行的应用程序或使用PostgreSQL数据库的应用程序):

Studio Pro Java
[weekday-from-dateTime(DateAttribute, 'America/New_York') = 6] //Logging.Log[weekday-from-dateTime(DateAttribute, 'America/New_York') = 6]