This is an automated email from the ASF dual-hosted git repository.
asf-gitbox-commits pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/cayenne.git
The following commit(s) were added to refs/heads/master by this push:
new 9f7c87d6b UPGRADE.md
9f7c87d6b is described below
commit 9f7c87d6bddbdf183e9f579d760e0772d1500335
Author: Andrus Adamchik <[email protected]>
AuthorDate: Fri May 22 16:50:02 2026 -0400
UPGRADE.md
* editing for clarity
---
UPGRADE.md | 100 ++++++++++++++++++++++++++++++-------------------------------
1 file changed, 50 insertions(+), 50 deletions(-)
diff --git a/UPGRADE.md b/UPGRADE.md
index d5f0d088c..9494f770c 100644
--- a/UPGRADE.md
+++ b/UPGRADE.md
@@ -2,8 +2,56 @@
> For upgrade notes for Cayenne 4.2 and older, see
> [UPGRADE-4.2-and-older.md](UPGRADE-4.2-and-older.md).
-**IMPORTANT:** Be sure to read all notes for the intermediate releases between
your current release
-and the release you are upgrading to.
+## What's New in 5.0
+
+This is a high-level overview of 5.0 changes. Check the next section for
milestone-by-milestone upgrade instructions.
+
+### New Dev Versioning Scheme
+
+Snapshot versions are now a constant value — the dev version of 5.0 will
always be `5.0-SNAPSHOT`,
+so you can stay at the bleeding edge of development if needed:
+
+```xml
+<dependency>
+ <groupId>org.apache.cayenne</groupId>
+ <artifactId>cayenne</artifactId>
+ <version>5.0-SNAPSHOT</version>
+</dependency>
+```
+
+### New Class Generation UI
+
+The new Class Generation UI in CayenneModeler simplifies configuration, allows
multiple `cgen` setups
+per project, and includes a template editor. Custom templates are now part of
the project XML
+configuration and don't require separate setup in either Modeler or
Maven/Gradle plugins.
+
+### Improved `(not)exists` Queries
+
+`(not)exists` is now directly supported by the Expression API (including
`Expression`, the expression
+parser, and the Property API) — no need to construct a subquery manually. The
feature can handle any
+expression and spawn several sub-queries per expression if needed:
+
+```java
+long count = ObjectSelect.query(Artist.class)
+
.where(Artist.PAINTING_ARRAY.dot(Painting.PAINTING_TITLE).like("painting%").exists())
+ .selectCount(context);
+```
+
+### Improved SQL Support
+
+`ANY` and `ALL` subqueries are now supported, as well as `case-when`
expressions:
+
+```java
+import static org.apache.cayenne.exp.ExpressionFactory.*;
+// ...
+Expression caseWhenExp = caseWhen(
+ List.of(betweenExp("estimatedPrice", 0, 9),
+ betweenExp("estimatedPrice", 10, 20)),
+ List.of(wrapScalarValue("low"),
+ wrapScalarValue("high")),
+ wrapScalarValue("error"));
+```
+
## Upgrading to 5.0.M2
@@ -128,51 +176,3 @@ and the release you are upgrading to.
* Per [CAY-2845](https://issues.apache.org/jira/browse/CAY-2845) `DataObject`
interface and `BaseDataObject` class were deprecated and all logic moved to
the `Persistent` interface and `PersistentObject` class. Regenerate model
classes via the cgen tool in
CayenneModeler or Maven/Gradle plugins.
-
-## New Features in 5.0
-
-### New Dev Versioning Scheme
-
-Snapshot versions are now a constant value — the dev version of 5.0 will
always be `5.0-SNAPSHOT`,
-so you can stay at the bleeding edge of development if needed:
-
-```xml
-<dependency>
- <groupId>org.apache.cayenne</groupId>
- <artifactId>cayenne</artifactId>
- <version>5.0-SNAPSHOT</version>
-</dependency>
-```
-
-### New Class Generation UI
-
-The new Class Generation UI in CayenneModeler simplifies configuration, allows
multiple `cgen` setups
-per project, and includes a template editor. Custom templates are now part of
the project XML
-configuration and don't require separate setup in either Modeler or
Maven/Gradle plugins.
-
-### Improved `(not)exists` Queries
-
-`(not)exists` is now directly supported by the Expression API (including
`Expression`, the expression
-parser, and the Property API) — no need to construct a subquery manually. The
feature can handle any
-expression and spawn several sub-queries per expression if needed:
-
-```java
-long count = ObjectSelect.query(Artist.class)
-
.where(Artist.PAINTING_ARRAY.dot(Painting.PAINTING_TITLE).like("painting%").exists())
- .selectCount(context);
-```
-
-### Improved SQL Support
-
-`ANY` and `ALL` subqueries are now supported, as well as `case-when`
expressions:
-
-```java
-import static org.apache.cayenne.exp.ExpressionFactory.*;
-// ...
-Expression caseWhenExp = caseWhen(
- List.of(betweenExp("estimatedPrice", 0, 9),
- betweenExp("estimatedPrice", 10, 20)),
- List.of(wrapScalarValue("low"),
- wrapScalarValue("high")),
- wrapScalarValue("error"));
-```