2.2. Ickle 查询语言语法
Ickle 查询语言是 JPQL 查询语言的子集,具有一些全文本扩展。
解析器语法有一些值得注意的规则:
- 空格并不重要。
- 字段名称不支持通配符。
- 必须始终指定字段名称或路径,因为没有默认字段。
-
&&
和||
在全文本和 JPA predicates 中都接受AND
或OR
。 -
!
可以被使用,而不是。
-
缺少布尔值运算符解释为
OR
。 - 字符串术语必须用单引号或双引号括起。
- Fuzziness 和 boosting 没有被任意顺序接受;fuzziness 始终是首先接受的。
-
!=
被接受,而不是 <>
。 -
boosting 无法应用到 >,
>
;=,
<
,<
;= operators。范围可用于实现相同的结果。
2.2.1. 过滤 Operator
Ickle 支持许多可用于索引和非索引字段的过滤运算符。
Operator | 描述 | Example |
---|---|---|
| 检查左侧运算对象是否等于所给值集合中的一个元素。 |
|
| 检查左侧参数(预期为 String)是否匹配 JPA 规则之后的通配符模式。 |
|
| 检查 left 参数是否与给定值完全匹配。 |
|
| 检查 left 参数是否与给定值不同。 |
|
| 检查 left 参数是否大于给定值。 |
|
| 检查 left 参数是否大于或等于给定值。 |
|
| 检查 left 参数是否小于给定值。 |
|
| 检查 left 参数是否小于或等于给定值。 |
|
| 检查 left 参数是否在给定的范围限值之间。 |
|
2.2.2. 布尔值条件
以下示例中演示了多个属性条件和逻辑组合(和
)和 disjunction (或
)运算符,以创建更复杂的条件。布尔值运算符的已知运算符优先级规则适用于此处,因此操作器的顺序无关。这里 和
运算符的优先级比 高,即使先调用 或
。
# 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 语句的预测
在某些用例中,如果应用实际使用了一小部分属性,则返回整个域对象是过量的,特别是在域实体有嵌入式实体时。查询语言允许您指定属性(或属性路径)的子集来返回 - 投射。如果使用投射,则 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%'
2.2.4.1. 项目缓存条目版本
可以使用版本投射功能来项目缓存条目 版本
。
# return the title, publication year and the cache entry version SELECT b.title, b.publicationYear, version(b) FROM org.infinispan.sample.Book b WHERE b.title like '%Data Grid%'
2.2.4.2. 项目缓存条目值
可以将 cache 条目值与其他项目一起项目。它可用于将缓存条目值与同一 Object[]
返回命中中的缓存条目版本一起项目。
# return the cache entry value and the cache entry version SELECT b, version(b) FROM org.infinispan.sample.Book b WHERE b.title like '%Data Grid%'
2.2.4.3. 分数项目
如果查询被索引,则可以将每个匹配的分数与其他投射。它可用于将缓存条目值与同一 Object[]
返回点击中的分数一起项目。
# return the cache entry value and the the score of the matching SELECT b, score(b) FROM org.infinispan.sample.Book b WHERE b.title 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 子句中带有一个或多个字段)。
支持的聚合有: avg
、sum
、count
、max
和 min
。
组分组字段通过 GROUP BY
子句指定,并且用于定义分组字段的顺序无关。投射中选择的所有字段都必须分组字段,否则必须使用下面描述的分组功能之一来聚合它们。项目字段可以聚合,并同时用于分组。选择仅分组字段但没有聚合字段的查询是法律的。附录示例:作者对手册进行分组,并计算它们。
SELECT author, COUNT(title) FROM org.infinispan.sample.Book WHERE title LIKE '%engine%' GROUP BY author
一个投射查询,所有选择的字段都应用了聚合功能,且无法用于分组的字段。在这种情况下,聚合将全局计算,就像有一个全局组一样。
聚合
您可以将以下聚合功能应用到一个字段:
聚合功能 | 描述 |
---|---|
|
计算一组数字的平均数量。接受的值是原始数字和 |
|
计算非null 行的数量并返回 |
|
返回找到的最大价值。接受的值必须是 |
|
返回找到的最小值。接受的值必须是 |
|
计算一组数字的总和。如果没有非 null 值,则结果为 |
字段类型 | 返回类型 |
---|---|
不可或缺(除 BigInteger) | Long |
float 或 Double | å�Œ |
BigInteger | BigInteger |
BigDecimal | BigDecimal |
使用分组和聚合评估查询
聚合查询可以包含过滤条件,如常规查询。可以在两个阶段执行过滤:在分组操作之前和之后执行。在执行分组操作之前,定义的所有过滤器条件都将应用到缓存条目(而不是最终投射)。这些过滤器条件可以引用查询的实体类型的任何字段,旨在限制要作为分组阶段输入的数据集。调用
groupBy ()
方法后定义的所有过滤器条件将应用到投射结果和分组操作。这些过滤器条件可以引用任何 groupBy ()
字段或聚合的字段。允许引用在 select 子句中指定的聚合字段,但禁止引用非aggregated 和 non-grouping 字段。在此阶段过滤将根据其属性减少组量。排序也可以指定,类似于常见的查询。排序操作在分组操作后执行,并可引用任何 groupBy ()
字段或聚合字段。
2.2.6. DELETE 语句
您可以使用以下语法从 Data Grid 缓存中删除实体:
DELETE FROM <entityName> [WHERE condition]
-
使用 <
entityName>
; 引用单个实体。DELETE 查询无法使用 join。 - WHERE 条件是可选的。
DELETE 查询无法使用以下任一方法:
- SELECT 语句的预测
- 分组和聚合
- ORDER BY 子句
调用 Query.executeStatement ()
方法来执行 DELETE 语句。