Skip to content

Commit e7d403e

Browse files
authored
Merge pull request #22 from gjwatts/draft
Jakarta Data Guide feedback suggestions
2 parents c198c5a + 82322ff commit e7d403e

File tree

1 file changed

+30
-24
lines changed

1 file changed

+30
-24
lines changed

README.adoc

Lines changed: 30 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,10 @@
88
//
99
:page-layout: guide-multipane
1010
:projectid: jakarta-data
11-
:page-duration: 500 minutes
11+
:page-duration: 15 minutes
1212
:page-releasedate: 2024-01-01
1313
:page-majorupdateddate: 2023-01-01
14-
:page-description: Description - TODO
14+
Description - TODO
1515
:page-tags: ['jakarta-ee']
1616
:page-related-guides: []
1717
:page-permalink: /guides/{projectid}
@@ -28,7 +28,7 @@ NOTE: This repository contains the guide documentation source. To view the guide
2828

2929
You will learn how to use Jakarta Data to store data as well as the simple, yet powerful options it provides for querying data. This will include writing queries that are created from the method name, as well as queries using annotations. Finally, you will learn about the Jakarta Data Query Language (JDQL).
3030

31-
The application demonstrates a number of different queries that are possible with Jakarta Data. Once you have completed the guide you can try writing your own queries with provided sample data.
31+
The application demonstrates a number of different queries that are possible with Jakarta Data. Once you have completed the guide you can try writing your own queries with the provided sample data.
3232

3333
=== What is Jakarta Data?
3434
Jakarta Data is a new data access specification being released with Jakarta EE 11. It provides a new API for simplified data access. Jakarta Data follows the Repository design pattern for data access, and allows for implementations which may support both SQL and NoSQL data stores. It also provides enhanced type safety with a Static Metamodel.
@@ -39,7 +39,7 @@ include::{common-includes}/gitclone.adoc[]
3939
[role='command']
4040
include::{common-includes}/twyb-intro.adoc[]
4141

42-
Go to the http://localhost:9080 URL to see all the application data. You will see a column of queries, some of which will accept input. To start find the `findAll` query with no inputs. Selecting this will return all of the packages similar to the following:
42+
This application allows you to run queries against a set of shipping packages which have a variety of dimensions and destinations. Go to the http://localhost:9080 URL to see all the application data. You will see a column of queries, some of which will accept input. To start find the `findAll` query with no inputs. Selecting this will return all of the query data similar to the following:
4343

4444
```
4545
ID Length Width Height Destination
@@ -53,8 +53,8 @@ ID Length Width Height Destination
5353
8 2 15 18 Rochester
5454
```
5555

56+
You can then try some of the queries which use input to see how it changes which packages are returned.
5657

57-
You can then try some of the queries which use input to see how it changes the returned packages.
5858

5959
== Creating an Entity and Repository
6060

@@ -88,14 +88,18 @@ include::finish/src/main/java/io/openliberty/guides/data/Packages.java[]
8888

8989
Repositories in Jakarta Data provide a simplified means for interacting with persistent data. Jakarta Data provides several built in Repositories with common methods which can be extended with application specific queries. The [hotspot=CrudRepository file=1]`CrudRepository` interface provides methods for Create, Read, Update, and Delete (CRUD) operations.
9090

91-
[hotspot=CrudRepository file=1]`CrudRepository` provides two options for persisting entities, `insert` and `save`. The first option `insert` will persist an entity only if the entity does not already exist. The `save` option will persist and entity even if it already exists, allowing it to be used for updating entities as well. [hotspot=CrudRepository file=1]`CrudRepository` provides a `delete` method for removing entities. All three of these methods can be applied to a list of entites using `insertAll`, `saveAll`, and `deleteAll`.
91+
[hotspot=CrudRepository file=1]`CrudRepository` provides two options for persisting entities, `insert` and `save`. The first option `insert` will persist an entity only if the entity does not already exist. The `save` option will persist an entity even if it already exists, allowing it to be used for updating entities as well. [hotspot=CrudRepository file=1]`CrudRepository` provides a `delete` method for removing entities.
9292

9393
```java
9494
Package p1 = new Package(1, 10f, 20f, 10f, "Rochester");
9595
packages.insert(p1);
96+
packages.save(p1);
9697
packages.delete(p1);
9798
```
9899

100+
All three of these methods can be applied to a list of entities using `insertAll`, `saveAll`, and `deleteAll`.
101+
102+
99103
== Query by Method Name
100104

101105
Packages.java
@@ -111,7 +115,7 @@ include::finish/src/main/java/io/openliberty/guides/data/Packages.java[]
111115
----
112116

113117

114-
Query by Method Name allows you to write queries using a descriptive method name following a few intuitive rules on how the method name is structured. This allows methods like `findByLengthGreaterThan(float length)` or `findByHeightAndWidth(float height, float width)` to automatically be turned into queries. Method names must start with an action like `find`, `delete`, or `count` and can contain include operators (such as `And`, `Or`, and `Not`) and conditions (such as `GreaterThan`, `LessThan`, and `Between`).
118+
Query by Method Name allows you to write queries using a descriptive method name following a few intuitive rules on how the method name is structured. This allows methods like `findByLengthGreaterThan(float length)` or `findByHeightAndWidth(float height, float width)` to automatically be turned into queries. Method names must start with an action like `find`, `delete`, or `count` and can include operators (such as `And`, `Or`, and `Not`) and conditions (such as `GreaterThan`, `LessThan`, and `Between`).
115119

116120
For more information on all of the options available with Query by Method name, see the https://jakarta.ee/specifications/data/1.0/jakarta-data-addendum-1.0.pdf[Query by Method Name Extension] of the Jakarta Data specification.
117121

@@ -131,7 +135,7 @@ include::finish/src/main/java/io/openliberty/guides/data/Packages.java[]
131135

132136
=== The `@Find` and `@By` Annotations
133137
The `@Find` annotation indicates that a method is a query which may return entities. Used in isolation it will
134-
return all entities, but by using the `@By` annotation, it can be limited to entities which match the value provided at runtime.
138+
return all entities, but by using the `@By` annotation, it can be limited to entities which match the value provided at runtime:
135139

136140
```java
137141
@Find
@@ -141,7 +145,7 @@ List<Package> getPackagesArrivingIn(@By("destination") String destination);
141145
//TODO should this mention --parameters at this point?
142146

143147
=== Renaming provided methods
144-
If a method name provided by a built in Jakarta Data repository class doesn't align with your repository you can use annotations to provide your own method. For example, using the `@Insert` annotation you can create a method named `add` instead of the `insert` method inherited from `CrudRepository` like this.
148+
If a method name provided by a built in Jakarta Data repository class doesn't align with your repository you can use annotations to provide your own method. For example, using the `@Insert` annotation you can create a method named `add` instead of the `insert` method inherited from `CrudRepository` like this:
145149

146150
```java
147151
@Insert
@@ -152,22 +156,22 @@ This method is functionally equivalent to the `insert` method provided by `CrudR
152156

153157

154158
=== The `@OrderBy` Annotation
155-
To provide ordering annotatively, you can use the `@OrderBy` annotation. The default ordering direction is ascending. To obtain all of the entities in a repository sorted by the height parameter, you could use the following.
159+
To provide ordering annotatively, you can use the `@OrderBy` annotation. The default ordering direction is ascending. To obtain all of the packages in the repository sorted by the height parameter, you could use the following:
156160

157161
```java
158162
@Find
159163
@OrderBy("height")
160164
List<Package> sortedByHeightAscending();
161165
```
162166

163-
`@OrderBy` can also return in descending order by specifying `descending = true` in the annotation.
167+
`@OrderBy` can also return in descending order by specifying `descending = true` in the annotation:
164168

165169
```java
166170
@OrderBy(value = "height", descending = true)
167171
```
168172
//TODO rename? Runtime Modifications...?
169173
== Sort, Limit, and Pagination
170-
Jakarta Data provides the `Sort` class and the `@Limit` annotation to create queries which can be modified at runtime. It also includes a mechanism for pagination to better handle large sets of results.
174+
Jakarta Data provides the `Sort` and `Limit` classes to create queries which can be modified at runtime. It also includes a mechanism for pagination to better handle large sets of results.
171175

172176
Packages.java
173177
[source, Java, linenums, role='code_column hide_tags=copyright,query-anno']
@@ -182,38 +186,38 @@ include::finish/src/main/java/io/openliberty/guides/data/Packages.java[]
182186
----
183187

184188
=== Sort
185-
In addition to the `@OrderBy` annotation it is possible to provide sorting at runtime. This is accomplished by adding a `Sort` as a parameter to your query method.
189+
In addition to the `@OrderBy` annotation it is possible to provide sorting at runtime. This is accomplished by adding a `Sort` parameter to your query method:
186190

187191
```java
188192
@Find
189193
List<Package> sorted(Sort<?> sortBy);
190194
```
191195

192-
A `Sort` can be created and provided at runtime using the Sort class's static methods:
196+
A `Sort` can be created and provided at runtime using the `Sort` class's static methods:
193197
```java
194198
Sort sort = Sort.desc("height");
195199
```
196200

197201
=== Limit
198-
Jakarta Data queries can restrict the number of results returned at runtime by providing a `Limit` object to the query.
202+
Jakarta Data queries can restrict the number of entities returned at runtime by providing a `Limit` object to the query:
199203

200204
```java
201205
List<Package> longestWithLimit(Limit limit);
202206
```
203207

204-
Limits can be created and supplied using the Limit class's static methods:
208+
Limits can be created and supplied using the `Limit` class's static methods:
205209
```java
206210
Limit limitTen = Limit.of(10);
207211
```
208212

209-
Limits can also be used to access a range of results, such as starting at result 10 and ending at result 20:
213+
Limits can also be used to access a range of entities, such as starting at the 10th entity and ending at the 20th:
210214
```java
211215
Limit range = Limit.range(10,20);
212216
```
213217

214218

215219
=== Paging
216-
When querying large amounts of data, paging is possible by providing a `PageRequest` in a query.
220+
When querying large amounts of data, paging is possible by adding a `PageRequest` parameter to your query method:
217221

218222
```java
219223
@Find
@@ -230,11 +234,11 @@ List<Package> results = page.content();
230234
Navigating pages can be done from the `Page` object:
231235

232236
```java
233-
Page<Package> anotherPage = packages.all(page.nextPageRequest());
237+
Page<Package> anotherPage = packages.all(page.nextPageRequest());
234238
```
235239

236240
== The Query Annotation
237-
The `@Query` annotation allows users to write queries using the Jakarta Data Query Language (JDQL). Complex queries can be written concisely using JDQL.
241+
The `@Query` annotation allows users to write queries using the Jakarta Data Query Language (JDQL). Complex queries can be written concisely using JDQL. JDQL is a strict subset of the Jakarta Persistence Query Language (JPQL).
238242

239243
Packages.java
240244
[source, Java, linenums, role='code_column hide_tags=copyright']
@@ -248,24 +252,26 @@ include::finish/src/main/java/io/openliberty/guides/data/Packages.java[]
248252
`src/main/java/io/openliberty/guides/data/Packages.java`
249253
----
250254

251-
Here is an example of a complex query simplified using JDQL.
255+
Here is an example of a complex query simplified using JDQL.
252256

253257
```java
254258
@Query("WHERE length > :threshold OR height > :threshold OR width > :threshold")
255259
List<Package> withDimensionLargerThan(float threshold);
256260
```
257261

258-
Achieving the same query with Query by Method Name would result in a very long method name and additional parameters. JDQL is a strict subset of the Jakarta Persistence Query Language (JPQL), supporting named and ordinal parameters, as well as a number of operators.
262+
Achieving the same query with Query by Method Name would result in a very long method name and additional parameters.
263+
259264

265+
JDQL supports named and ordinal parameters, as well as a number of operators.
260266
```java
261267
@Query("WHERE length + width + height > ?1")
262268
List<Package> withTotalDimensionOver(float threshold);
263269
```
264270

265-
See the Jakarta Data specification for a more comprehensive overview of the Jakarta Data Query Language.
271+
See the https://jakarta.ee/specifications/data/1.0/jakarta-data-1.0#_jakarta_data_query_language[Jakarta Data specification] for a more comprehensive overview of the Jakarta Data Query Language.
266272

267273
== Where to next?
268-
Try out the sample application by creating your own queries. Add your own queries to the `Packages` class like the provided ones and then try them out in the sample application.
274+
Experiment by creating your own queries. Use the existing ones in the `Packages` class as a starting point and then test them out in the sample application.
269275

270276
//Eventually link to an Advanced Guide as well.
271277
//Include Static Metamodel

0 commit comments

Comments
 (0)