2.2. Ickle 查询语言语法
Ickle 查询语言是 JPQL 查询语言的子集,一些用于全文本的扩展。
解析器语法有一些值得注意的规则:
- 空格并不重要。
- 字段名称不支持通配符。
- 必须始终指定字段名称或路径,因为没有默认字段。
-
在
全文本和 JPA predicates 中,接受 &
amp;& 和||
| 而不是AND
或OR
。 -
可以使用
!
而不是 not。
-
缺少布尔值运算符解释为
OR
。 - 字符串术语必须用单引号或双引号括起来。
- Fuzziness 和 boosting 不会被任意顺序接受;模糊始终首先是第一个。
-
!=
被接受,而不是 <>
。 -
提升无法应用到 > ,
&
gt;=,
<
,<
;= operators。范围可用于实现相同的结果。
2.2.1. 过滤 Operator
Ickle 支持可用于索引和非索引字段的许多过滤运算符。
Operator | 描述 | 示例 |
---|---|---|
| 检查左侧操作对象是否等于集合以参数形式给出的其中一个元素。 |
|
| 检查 left 参数(预期为字符串)是否与 JPA 规则后面的通配符模式匹配。 |
|
| 检查 left 参数是否与给定值完全匹配。 |
|
| 检查 left 参数是否与给定值不同。 |
|
| 检查 left 参数是否大于给定值。 |
|
| 检查 left 参数是否大于或等于给定值。 |
|
| 检查 left 参数是否小于给定值。 |
|
| 检查 left 参数是否小于或等于给定值。 |
|
| 检查 left 参数是否在给定范围限制之间。 |
|
2.2.2. 布尔值条件
将多个属性条件与逻辑组合(和
)和解除关联(或
)运算符相结合,以便演示下例中更复杂的条件。布尔值运算符的已知 Operator 优先级规则应用在此处,因此运算符的顺序无关。这里的 operator 仍然具有更高的优先级,即使
先调用。或被
# match all books that have "Data Grid" in their title # or have an author named "Manik" and their description contains "clustering" FROM org.infinispan.sample.Book WHERE title LIKE '%Data Grid%' OR author.name = 'Manik' AND description like '%clustering%'
布尔值在逻辑运算符之间具有最高优先级,仅适用于下一个简单的属性条件。
# match all books that do not have "Data Grid" in their title and are authored by "Manik" FROM org.infinispan.sample.Book WHERE title != 'Data Grid' AND author.name = 'Manik'
2.2.3. 嵌套条件
使用括号更改逻辑运算符的优先级:
# match all books that have an author named "Manik" and their title contains # "Data Grid" or their description contains "clustering" FROM org.infinispan.sample.Book WHERE author.name = 'Manik' AND ( title like '%Data Grid%' OR description like '% clustering%')
2.2.4. 使用 SELECT 语句进行预测
在某些情况下,如果应用程序实际使用一小部分属性,则返回整个域对象的用例会被过度使用,特别是在域实体已嵌入实体时。查询语言允许您指定属性子集(或属性路径)来返回 - 投射。如果使用 projections,则 QueryResult.list ()
将不会返回整个域实体,而是会返回 Object[]
列表
,每个插槽都与投射属性对应。
# match all books that have "Data Grid" in their title or description # and return only their title and publication year SELECT title, publicationYear FROM org.infinispan.sample.Book WHERE title like '%Data Grid%' OR description like '%Data Grid%'
排序
根据一个或多个属性或属性路径对结果进行排序,使用 ORDER BY
子句完成。如果指定了多个排序条件,则顺序将决定其优先级。
# match all books that have "Data Grid" in their title or description # and return them sorted by the publication year and title FROM org.infinispan.sample.Book WHERE title like '%Data Grid%' ORDER BY publicationYear DESC, title ASC
2.2.5. 分组和聚合
Data Grid 可根据一组分组字段和构建来自每个组中结果的聚合来对查询结果进行分组,方法是将聚合功能应用到每个组中的一组值。分组和聚合只能应用到投射查询(与 SELECT 子句中的一个或多个字段无关)。
支持的聚合有:vg、sum
、count
、max
、和 min
。
使用 GROUP BY
子句指定一组分组字段,用于定义分组字段的顺序不相关。投射中选择的所有字段都必须是分组字段,或者必须使用下面描述的分组函数之一来聚合它们。可聚合投射字段,用于同时分组。仅选择分组字段但没有聚合字段的查询。示例:按作者分组书签并计数它们。
SELECT author, COUNT(title) FROM org.infinispan.sample.Book WHERE title LIKE '%engine%' GROUP BY author
所有所选字段都应用了聚合函数的投射查询,并且不允许使用任何字段分组。在这种情况下,聚合将全局计算,就像只有一个全局组一样。
聚合
您可以将以下聚合功能应用到一个字段中:
聚合功能 | 描述 |
---|---|
|
计算一组数字的平均值。接受的值是 |
|
计算非空行的数量并返回 |
|
返回找到的最大值。接受的值必须是 |
|
返回找到的最小值。接受的值必须是 |
|
计算一组数字的总和。如果没有非空值,则结果为 |
字段类型 | 返回类型 |
---|---|
Integrationl (除 bigInteger 以外) | Long |
float 或 Double | å�Œ |
BigInteger | BigInteger |
BigDecimal | BigDecimal |
使用分组和聚合评估查询
聚合查询可以包含过滤条件,如常见的查询。可以在两个阶段执行过滤:分组操作之前和之后。在执行分组操作前,将应用调用 groupBy ()
方法前定义的所有过滤器条件,直接发送到缓存条目(而不是最终投射)。这些过滤器条件可以引用查询实体类型的任何字段,并旨在限制将要作为分组阶段输入的数据集。调用 groupBy ()
方法后定义的所有过滤器条件将应用到来自投射和分组操作的预测。这些过滤器条件可以引用任何 groupBy ()
字段或聚合字段。允许引用在 select 子句中指定的聚合字段;但是,禁止引用非集合和非组字段。在此阶段过滤将根据其属性减少组数量。也可以指定类似于常见查询的排序。排序操作是在分组操作后执行的,并可引用任何 groupBy ()
字段或聚合字段。
2.2.6. DELETE 语句
您可以使用以下语法从 Data Grid 缓存中删除实体:
DELETE FROM <entityName> [WHERE condition]
-
仅引用具有 <
entityName&
gt; 的单一实体。DELETE 查询无法使用加入。 - WHERE 条件是可选的。
DELETE 查询无法使用以下任一操作:
- 使用 SELECT 语句进行预测
- 分组和聚合
- ORDER BY 子句
调用 Query.executeStatement ()
方法来执行 DELETE 语句。