Skip to content

Commit 34a58e0

Browse files
committed
DATAMONGO-1245 - Documentation for Query-by-Example.
1 parent 6270e86 commit 34a58e0

File tree

2 files changed

+14
-96
lines changed

2 files changed

+14
-96
lines changed

src/main/asciidoc/index.adoc

+1
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ include::{spring-data-commons-docs}/repositories.adoc[]
2727
include::reference/introduction.adoc[]
2828
include::reference/mongodb.adoc[]
2929
include::reference/mongo-repositories.adoc[]
30+
include::{spring-data-commons-docs}/query-by-example.adoc[]
3031
include::reference/query-by-example.adoc[]
3132
include::{spring-data-commons-docs}/auditing.adoc[]
3233
include::reference/mongo-auditing.adoc[]

src/main/asciidoc/reference/query-by-example.adoc

+13-96
Original file line numberDiff line numberDiff line change
@@ -1,69 +1,6 @@
1-
[[query.by.example]]
2-
= Query by Example
1+
You can use Query by Example with the `MongoTemplate` and with Repositories.
32

4-
== Introduction
5-
6-
This chapter will give you an introduction to Query by Example and explain how to use example specifications.
7-
8-
Query by Example (QBE) is a user-friendly querying technique with a simple interface. It allows dynamic query creation and does not require to write queries containing field names. In fact, Query by Example does not require to write queries using store-specific query languages at all.
9-
10-
== Usage
11-
12-
An `Example` takes a data object (usually the domain object object or a subtype of it) and a specification how to match properties. You can use Query by Example with the `MongoTemplate` and with Repositories.
13-
14-
Query by Example is suited for several use-cases but also comes with limitations:
15-
16-
**When to use**
17-
18-
* Querying your data store with a set of static or dynamic constraints
19-
* Frequent refactoring of the domain objects without worrying about breaking existing queries
20-
* Works independently from the data store API
21-
22-
**Limitations**
23-
24-
* Query predicates are combined using the `AND` keyword
25-
* No support for nested/grouped property constraints like `firstname = ?0 or (firstname = ?1 and lastname = ?2)`
26-
* Only supports starts/contains/ends/regex matching for strings and exact matching for other property types
27-
28-
29-
Before getting started with Query by Example you need to have your interface to the data store set up.
30-
31-
.Sample Person object
32-
====
33-
[source,java]
34-
----
35-
public class Person {
36-
37-
@Id
38-
private String id;
39-
private String firstname;
40-
private String lastname;
41-
private Address address;
42-
43-
// … getters and setters omitted
44-
}
45-
----
46-
====
47-
48-
This is a simple domain object. You can use it to create an Example specification. By default, fields having `null` values are ignored, and strings are matched using the store specific defaults. Examples can be built by either using the `exampleOf` factory method or by using the <<query.by.example.builder,Example builder>>. Once the `Example` is constructed it becomes immutable.
49-
50-
.Simple Example specification
51-
====
52-
[source,xml]
53-
----
54-
Person person = new Person(); <1>
55-
56-
person.setFirstname("Dave"); <2>
57-
58-
Example<Person> example = Example.exampleOf(person); <3>
59-
----
60-
<1> Create a new instance of the domain object
61-
<2> Set the properties to query
62-
<3> Create an `Example`
63-
====
64-
65-
66-
NOTE: Property names of the sample object must correlate with the property names of the queried domain object.
3+
NOTE: Property names of the probet must correlate with the property names of the queried domain object.
674

685
.Query by Example using MongoTemplate
696
====
@@ -72,55 +9,35 @@ NOTE: Property names of the sample object must correlate with the property names
729
@Autowired
7310
MongoTemplate template;
7411
75-
public List<Person> findPeople(Person sampleObject) {
76-
return template.findByExample(Example.exampleOf(person));
12+
public List<Person> findPeople(Person probe) {
13+
return template.findByExample(Example.of(probe));
7714
}
7815
----
7916
====
8017

81-
`MongoTemplate.findByExample` accepts either the sample object or an `Example` object to create and execute a query.
18+
`MongoTemplate.findByExample` accepts either the probe or an `Example` object to create and execute a query.
8219

8320

8421
.Query by Example using a Repository
8522
====
8623
[source, java]
8724
----
88-
public interface MongoRepository<Person, String> {
25+
public interface PersonRepository extends MongoRepository<Person, String> {
8926
90-
<S extends Person> List<Person> findAllByExample(Example<S> example);
91-
92-
<S extends Person> List<Person> findAllByExample(Example<S> example, Sort sort);
93-
94-
<S extends Person> Page<Person> findAllByExample(Example<S> example, Pageable pageable);
95-
96-
// … more functionality omitted.
9727
}
98-
----
99-
====
10028
101-
[[query.by.example.builder]]
102-
== Example builder
29+
public class PersonService {
10330
104-
Examples are not limited to default settings. You can specify own defaults for string matching, null handling and property-specific settings using the example builder.
31+
@Autowired PersonRepository personRepository;
10532
106-
.Query by Example builder
107-
====
108-
[source, java]
109-
----
110-
Example.newExampleOf(person)
111-
.withStringMatcher(StringMatcher.ENDING)
112-
.includeNullValues()
113-
.withPropertySpecifier(
114-
newPropertySpecifier("firstname").matchString(StringMatcher.CONTAINING).get())
115-
.withPropertySpecifier(
116-
newPropertySpecifier("lastname").matchStringsWithIgnoreCase().get())
117-
.withPropertySpecifier(
118-
newPropertySpecifier("address.city").matchStringStartingWith().get())
119-
.get();
33+
public List<Person> findPeople(Person probe) {
34+
return personRepository.findAll(Example.of(probe));
35+
}
36+
}
12037
----
12138
====
12239

123-
Property specifier accepts property names (e.g. "firstname" and "lastname"). You can navigate by chaining properties together with dots ("address.city"). You can tune it with matching options and case sensitivity.
40+
Spring Data MongoDB provides support for the following matching options:
12441

12542
[cols="1,2", options="header"]
12643
.`StringMatcher` options

0 commit comments

Comments
 (0)