|
对于最新稳定版本,请使用Spring Data Neo4j 8.0.0! |
示例查询
介绍
本章介绍了示例查询,并解释了如何使用它。
示例查询(QBE)是一种用户友好的查询技术,界面简单。 它支持动态查询创建,且不需要编写包含字段名称的查询。 事实上,示例查询并不要求你使用商店特定的查询语言来编写查询。
| 本章解释了“示例查询”的核心概念。 这些信息取自Spring Data Commons模块。 根据你的数据库,字符串匹配支持可能有限。 |
用法
示例查询API由四个部分组成:
-
探测:带有填充字段的域对象的实际示例。
-
ExampleMatcher:这ExampleMatcher包含如何匹配特定字段的详细信息。 它可以在多个示例中重复使用。 -
示例:一示例由探针和ExampleMatcher. 它用于创建查询。 -
FetchableFluentQuery:一个FetchableFluentQuery提供流畅的API,允许对源自示例. 使用 Fluent API 可以让你为查询指定排序、投影和结果处理。
示例查询适用于多种用例:
-
用一组静态或动态约束查询你的数据存储。
-
频繁重构域对象,无需担心破坏现有查询。
-
它独立于底层数据存储 API。
示例查询还有若干局限性:
-
不支持嵌套或分组属性约束,例如
名字 = ?0 或(名字 = ?1,姓氏 = ?2). -
针对字符串匹配的商店专用支持。 根据你的数据库,字符串匹配可以支持字符串的起始/包含/结束/正则表达式。
-
其他类型的房产进行精确匹配。
在开始使用示例查询之前,你需要有一个域对象。 要开始,请为你的仓库创建一个界面,如下示例所示:
public class Person {
@Id
private String id;
private String firstname;
private String lastname;
private Address address;
// … getters and setters omitted
}
前面的例子展示了一个简单的领域对象。
你可以用它来创建一个示例.
默认情况下,字段具有零值被忽略,字符串通过存储的特定默认值进行匹配。
属性包含在示例查询标准中基于可空性。
使用原始类型的性质(智力,双, …)除非ExampleMatcher忽略属性路径. |
示例可以通过以下几个方法构建之工厂方法或使用ExampleMatcher.示例是不可改变的。
以下列表展示了一个简单的示例:
Person person = new Person(); (1)
person.setFirstname("Dave"); (2)
Example<Person> example = Example.of(person); (3)
| 1 | 创建一个新的域对象实例。 |
| 2 | 将属性设置为查询。 |
| 3 | 创建示例. |
你可以通过使用仓库来运行示例查询。
为此,可以让你的仓库接口扩展QueryByExampleExecutor<T>.
以下列表展示了以下内容的摘录QueryByExampleExecutor接口:
QueryByExampleExecutorpublic interface QueryByExampleExecutor<T> {
<S extends T> S findOne(Example<S> example);
<S extends T> Iterable<S> findAll(Example<S> example);
// … more functionality omitted.
}
示例匹配器
示例不仅限于默认设置。
你可以自定义字符串匹配、空处理和属性特定设置的默认设置,方法是使用ExampleMatcher如下例所示:
Person person = new Person(); (1)
person.setFirstname("Dave"); (2)
ExampleMatcher matcher = ExampleMatcher.matching() (3)
.withIgnorePaths("lastname") (4)
.withIncludeNullValues() (5)
.withStringMatcher(StringMatcher.ENDING); (6)
Example<Person> example = Example.of(person, matcher); (7)
| 1 | 创建一个新的域对象实例。 |
| 2 | 设置属性。 |
| 3 | 创建一个ExampleMatcher期望所有数值都匹配。
即使没有进一步配置,目前仍可使用。 |
| 4 | 构建一个新的ExampleMatcher忽略姓氏财产路径。 |
| 5 | 构建一个新的ExampleMatcher忽略姓氏属性路径,并包含空值。 |
| 6 | 构建一个新的ExampleMatcher忽略姓氏属性路径,包含空值,并执行字符串后缀匹配。 |
| 7 | 创建一个新的示例基于域对象和配置ExampleMatcher. |
默认情况下,ExampleMatcher期望探针上设置的所有值都匹配。
如果你想得到与任何隐式定义的谓词匹配的结果,可以用示例Matcher.matchingAny().
你可以为单个属性指定行为(比如“名字”和“姓氏”,嵌套属性则是“address.city”)。 你可以根据匹配选项和大小写敏感度进行调整,如下示例所示:
ExampleMatcher matcher = ExampleMatcher.matching()
.withMatcher("firstname", endsWith())
.withMatcher("lastname", startsWith().ignoreCase());
}
配置匹配器选项的另一种方法是使用 lambda(Java 8 引入)。 这种方法会生成一个回调,要求实现者修改匹配器。 你无需返回匹配器,因为配置选项保留在匹配器实例中。 以下示例展示了使用 lambda 的匹配器:
ExampleMatcher matcher = ExampleMatcher.matching()
.withMatcher("firstname", match -> match.endsWith())
.withMatcher("firstname", match -> match.startsWith());
}
由示例使用合并视图来展示配置。
默认匹配设置可以在ExampleMatcher而个别设置可以应用于特定的物业路径。
设置为ExampleMatcher除非属性路径设置被明确定义,否则会继承。
属性补丁上的设置优先级高于默认设置。
下表描述了各类的范围ExampleMatcher设置:
| 设置 | 范围 |
|---|---|
空处理 |
|
字符串匹配 |
|
忽略性质 |
性质路径 |
大小写区分 |
|
价值转换 |
性质路径 |
Fluent API
QueryByExampleExecutor还有一种方法,我们之前还没提到:<S 扩展 T, R>R findBy(example<S>例,Function<FluentQuery.FetchableFluentQuery<S>, R> queryFunction).
与其他方法一样,它执行由示例.
然而,通过第二个参数,你可以控制执行中那些你无法动态控制的部分。
你通过调用各种方法来实现FetchableFluentQuery在第二个论点中。排序它让你为结果指定排序。如你可以指定你想将结果转换成哪种类型。项目限制被查询属性。第一,第一个值,一,一值,都,页,流,计数和存在定义你得到的结果类型以及当可用结果数量超过预期时查询的行为。
Optional<Person> match = repository.findBy(example,
q -> q
.sortBy(Sort.by("lastname").descending())
.first()
);