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

commit f357868ddf1d7c884491bd6671e287dec5b8ae2c
Author: Andrus Adamchik <[email protected]>
AuthorDate: Sun Aug 30 14:17:47 2026 -0400

    Query cleanup: QueryChain is deprecated
---
 .../apache/cayenne/lifecycle/id/StringIdQuery.java  | 19 +++++++++----------
 .../java/org/apache/cayenne/query/MappedSelect.java |  2 +-
 .../java/org/apache/cayenne/query/QueryChain.java   |  4 ++++
 .../main/java/org/apache/cayenne/query/package.html |  1 -
 .../DataContextEJBQLFunctionalExpressionsIT.java    | 21 ++++++++-------------
 .../_cayenne-guide/part2/objectContext.adoc         | 13 +++++++++++--
 6 files changed, 33 insertions(+), 27 deletions(-)

diff --git 
a/cayenne-lifecycle/src/main/java/org/apache/cayenne/lifecycle/id/StringIdQuery.java
 
b/cayenne-lifecycle/src/main/java/org/apache/cayenne/lifecycle/id/StringIdQuery.java
index 946874628..7fce7f88e 100644
--- 
a/cayenne-lifecycle/src/main/java/org/apache/cayenne/lifecycle/id/StringIdQuery.java
+++ 
b/cayenne-lifecycle/src/main/java/org/apache/cayenne/lifecycle/id/StringIdQuery.java
@@ -18,14 +18,6 @@
  ****************************************************************/
 package org.apache.cayenne.lifecycle.id;
 
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-
 import org.apache.cayenne.ObjectContext;
 import org.apache.cayenne.exp.Expression;
 import org.apache.cayenne.exp.ExpressionFactory;
@@ -38,13 +30,20 @@ import org.apache.cayenne.query.ObjectSelect;
 import org.apache.cayenne.query.PrefetchTreeNode;
 import org.apache.cayenne.query.Query;
 import org.apache.cayenne.query.QueryCacheStrategy;
-import org.apache.cayenne.query.QueryChain;
 import org.apache.cayenne.query.QueryMetadata;
 import org.apache.cayenne.query.QueryRouter;
 import org.apache.cayenne.query.SQLAction;
 import org.apache.cayenne.query.SQLActionVisitor;
 import org.apache.cayenne.reflect.ClassDescriptor;
 
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+
 /**
  * A query that allows to fetch objects based on one or more String IDs. The 
returned
  * objects do not have to be of the same type, be related via inheritance, or 
come from
@@ -53,7 +52,7 @@ import org.apache.cayenne.reflect.ClassDescriptor;
  * contain separate lists of DataRows for each type in no particular order.
  * <p>
  * As of this writing, a limitation of this query is that it returns DataRows 
that need to
- * be manually converted to objects if needed. In that it is similar to {@link 
QueryChain}.
+ * be manually converted to objects if needed.
  * 
  * @since 3.1
  */
diff --git a/cayenne/src/main/java/org/apache/cayenne/query/MappedSelect.java 
b/cayenne/src/main/java/org/apache/cayenne/query/MappedSelect.java
index e6062bc25..a9deacadd 100644
--- a/cayenne/src/main/java/org/apache/cayenne/query/MappedSelect.java
+++ b/cayenne/src/main/java/org/apache/cayenne/query/MappedSelect.java
@@ -146,7 +146,7 @@ public class MappedSelect<T> extends AbstractMappedQuery 
implements Select<T> {
     public MappedSelect<T> param(String name, Object value) {
         return (MappedSelect<T>) super.param(name, value);
     }
-    
+
     @Override
     public T selectFirst(ObjectContext context) {
         return context.selectFirst(limit(1));
diff --git a/cayenne/src/main/java/org/apache/cayenne/query/QueryChain.java 
b/cayenne/src/main/java/org/apache/cayenne/query/QueryChain.java
index 3f701abf5..df5dd9449 100644
--- a/cayenne/src/main/java/org/apache/cayenne/query/QueryChain.java
+++ b/cayenne/src/main/java/org/apache/cayenne/query/QueryChain.java
@@ -32,7 +32,11 @@ import java.util.List;
  * convert the results to objects.
  * 
  * @since 1.2
+ * @deprecated to run multiple queries together, execute them inside an 
explicit
+ *             transaction, e.g. via
+ *             {@link 
org.apache.cayenne.runtime.CayenneRuntime#performInTransaction(org.apache.cayenne.tx.TransactionalOperation)}
  */
+@Deprecated(since = "5.0", forRemoval = true)
 public class QueryChain implements Query {
 
     protected Collection<Query> chain;
diff --git a/cayenne/src/main/java/org/apache/cayenne/query/package.html 
b/cayenne/src/main/java/org/apache/cayenne/query/package.html
index 2d1e5503c..e39f417f3 100644
--- a/cayenne/src/main/java/org/apache/cayenne/query/package.html
+++ b/cayenne/src/main/java/org/apache/cayenne/query/package.html
@@ -30,7 +30,6 @@ Normally users would only care about these general query 
classes:
 and sometimes - these specialized queries:
 
 <ul>
-       <li>QueryChain</li>
        <li>RelationshipQuery</li>
        <li>SingleObjectQuery</li>
 </ul>
diff --git 
a/cayenne/src/test/java/org/apache/cayenne/access/DataContextEJBQLFunctionalExpressionsIT.java
 
b/cayenne/src/test/java/org/apache/cayenne/access/DataContextEJBQLFunctionalExpressionsIT.java
index 6a90f6414..3e8964bef 100644
--- 
a/cayenne/src/test/java/org/apache/cayenne/access/DataContextEJBQLFunctionalExpressionsIT.java
+++ 
b/cayenne/src/test/java/org/apache/cayenne/access/DataContextEJBQLFunctionalExpressionsIT.java
@@ -20,8 +20,7 @@ package org.apache.cayenne.access;
 
 import org.apache.cayenne.Cayenne;
 import org.apache.cayenne.query.EJBQLQuery;
-import org.apache.cayenne.query.QueryChain;
-import org.apache.cayenne.query.SQLTemplate;
+import org.apache.cayenne.test.jdbc.TableHelper;
 import org.apache.cayenne.testdo.testmap.Artist;
 import org.apache.cayenne.testdo.testmap.Painting;
 import org.apache.cayenne.unit.CayenneProjects;
@@ -29,6 +28,7 @@ import org.apache.cayenne.unit.CayenneTestsEnv;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
+import java.sql.SQLException;
 import java.util.List;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -189,17 +189,12 @@ public class DataContextEJBQLFunctionalExpressionsIT {
     }
 
     @Test
-    public void tRIM() {
-
-        // insert via a SQL template to prevent adapter trimming and such...
-        QueryChain inserts = new QueryChain();
-        inserts.addQuery(new SQLTemplate(
-                Artist.class,
-                "INSERT INTO ARTIST (ARTIST_ID,ARTIST_NAME) VALUES(1, '  
A')"));
-        inserts.addQuery(new SQLTemplate(
-                Artist.class,
-                "INSERT INTO ARTIST (ARTIST_ID,ARTIST_NAME) VALUES(2, 'A  
')"));
-        env.context().performGenericQuery(inserts);
+    public void tRIM() throws SQLException {
+
+        // insert via raw JDBC to prevent adapter trimming and such...
+        TableHelper tArtist = env.table("ARTIST", "ARTIST_ID", "ARTIST_NAME");
+        tArtist.insert(1, "  A");
+        tArtist.insert(2, "A  ");
 
         Artist a1 = Cayenne.objectForPK(env.context(), Artist.class, 1);
         Artist a2 = Cayenne.objectForPK(env.context(), Artist.class, 2);
diff --git 
a/docs/cayenne-guide/src/docs/asciidoc/_cayenne-guide/part2/objectContext.adoc 
b/docs/cayenne-guide/src/docs/asciidoc/_cayenne-guide/part2/objectContext.adoc
index 8e85c47e0..4fec460a0 100644
--- 
a/docs/cayenne-guide/src/docs/asciidoc/_cayenne-guide/part2/objectContext.adoc
+++ 
b/docs/cayenne-guide/src/docs/asciidoc/_cayenne-guide/part2/objectContext.adoc
@@ -82,12 +82,21 @@ Some queries can be quite complex, returning multiple 
result sets or even updati
 For such queries, ObjectContext provides the `performGenericQuery()` method.
 While not commonly used, it is nevertheless important in some situations. E.g.:
 
+[source, java]
+----
+QueryResponse response = context.performGenericQuery(query);
+----
+
+When multiple such queries need to run together, execute them inside an 
explicit transaction:
+
 [source, java]
 ----
 Collection<Query> queries = ... // multiple queries that need to be run 
together
-QueryChain query = new QueryChain(queries);
 
-QueryResponse response = context.performGenericQuery(query);
+runtime.performInTransaction(() -> {
+    queries.forEach(context::performGenericQuery);
+    return null;
+});
 ----
 
 

Reply via email to