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; +}); ----
