This is an automated email from the ASF dual-hosted git repository.

ntimofeev pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/cayenne.git

commit e752587f3e7eb5b3afcc1ddbf665a109e5ab0c41
Author: Nikita Timofeev <[email protected]>
AuthorDate: Fri Jul 1 17:54:46 2022 +0300

    CAY-2737 Cayenne 4.3: cleanup deprecated code
     - remove SelectQuery and all related code
---
 .../translator/select/DefaultSelectTranslator.java |  11 +-
 .../select/DefaultSelectTranslatorFactory.java     |   5 +-
 .../translator/select/SelectQueryWrapper.java      |  78 --
 .../access/translator/select/SelectTranslator.java |   4 +-
 .../java/org/apache/cayenne/dba/AutoAdapter.java   |  10 -
 .../java/org/apache/cayenne/dba/DbAdapter.java     |  11 -
 .../org/apache/cayenne/dba/JdbcActionBuilder.java  |   6 -
 .../java/org/apache/cayenne/dba/JdbcAdapter.java   |   7 -
 .../apache/cayenne/dba/db2/DB2ActionBuilder.java   |   6 -
 .../cayenne/dba/derby/DerbyActionBuilder.java      |   6 -
 .../dba/firebird/FirebirdActionBuilder.java        |   7 -
 .../org/apache/cayenne/dba/h2/H2ActionBuilder.java |   6 -
 .../cayenne/dba/hsqldb/HSQLActionBuilder.java      |   6 -
 .../cayenne/dba/ingres/IngresActionBuilder.java    |   6 -
 .../cayenne/dba/mysql/MySQLActionBuilder.java      |   6 -
 .../cayenne/dba/oracle/OracleActionBuilder.java    |   6 -
 .../dba/postgres/PostgresActionBuilder.java        |   6 -
 .../cayenne/dba/sqlite/SQLiteActionBuilder.java    |   9 -
 .../dba/sqlserver/SQLServerActionBuilder.java      |  18 +-
 .../query/FluentSelectPrefetchRouterAction.java    |   1 -
 .../org/apache/cayenne/query/ObjectSelect.java     |   6 +-
 .../apache/cayenne/query/PrefetchSelectQuery.java  |   2 +-
 .../org/apache/cayenne/query/SQLActionVisitor.java |   5 -
 .../java/org/apache/cayenne/query/SelectQuery.java | 838 -------------------
 .../apache/cayenne/query/SelectQueryMetadata.java  | 305 -------
 .../query/SelectQueryPrefetchRouterAction.java     | 142 ----
 .../DataContextSelectQuerySplitAliasesIT.java      | 105 ---
 .../java/org/apache/cayenne/access/EnumIT.java     |  14 -
 .../select/DefaultSelectTranslatorIT.java          |   6 +-
 .../cayenne/query/SelectQueryCacheKeyIT.java       | 222 -----
 .../query/SelectQueryFetchLimitOrderingIT.java     |  82 --
 .../org/apache/cayenne/query/SelectQueryIT.java    | 903 ---------------------
 .../query/SelectQueryPrefetchRouterActionIT.java   |  98 ---
 ...QueryPrefetchRouterActionQualifiedEntityIT.java |  79 --
 .../org/apache/cayenne/query/SelectQueryTest.java  | 180 ----
 .../apache/cayenne/query/StatementFetchSizeIT.java |  12 -
 .../org/apache/cayenne/unit/jira/CAY_115IT.java    |  12 +-
 .../_cayenne-guide/part2/queries/custom.adoc       |   2 +-
 .../_cayenne-guide/part2/queries/objectselect.adoc |   2 +-
 39 files changed, 21 insertions(+), 3209 deletions(-)

diff --git 
a/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/DefaultSelectTranslator.java
 
b/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/DefaultSelectTranslator.java
index faa7fb465..203d1c1af 100644
--- 
a/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/DefaultSelectTranslator.java
+++ 
b/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/DefaultSelectTranslator.java
@@ -29,10 +29,9 @@ import org.apache.cayenne.dba.DbAdapter;
 import org.apache.cayenne.map.EntityResolver;
 import org.apache.cayenne.map.ObjAttribute;
 import org.apache.cayenne.query.FluentSelect;
-import org.apache.cayenne.query.SelectQuery;
 
 /**
- * Default translator of select queries ({@link SelectQuery} or {@link 
FluentSelect}).
+ * Default translator of select queries {@link FluentSelect}.
  *
  * @since 4.2
  */
@@ -77,14 +76,6 @@ public class DefaultSelectTranslator implements 
SelectTranslator {
         this.context = new TranslatorContext(query, adapter, entityResolver, 
null);
     }
 
-    /**
-     * @deprecated since 4.2 as {@link SelectQuery} is deprecated.
-     */
-    @Deprecated
-    public DefaultSelectTranslator(SelectQuery<?> query, DbAdapter adapter, 
EntityResolver entityResolver) {
-        this(new SelectQueryWrapper(query), adapter, entityResolver);
-    }
-
     public DefaultSelectTranslator(FluentSelect<?> query, DbAdapter adapter, 
EntityResolver entityResolver) {
         this(new FluentSelectWrapper(query), adapter, entityResolver);
     }
diff --git 
a/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/DefaultSelectTranslatorFactory.java
 
b/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/DefaultSelectTranslatorFactory.java
index 941be10a5..e429b27f0 100644
--- 
a/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/DefaultSelectTranslatorFactory.java
+++ 
b/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/DefaultSelectTranslatorFactory.java
@@ -23,7 +23,6 @@ import org.apache.cayenne.dba.DbAdapter;
 import org.apache.cayenne.map.EntityResolver;
 import org.apache.cayenne.query.FluentSelect;
 import org.apache.cayenne.query.Select;
-import org.apache.cayenne.query.SelectQuery;
 
 /**
  * A {@link SelectTranslator} factory that delegates translator creation to
@@ -35,9 +34,7 @@ public class DefaultSelectTranslatorFactory implements 
SelectTranslatorFactory {
 
        @Override
        public SelectTranslator translator(Select<?> query, DbAdapter adapter, 
EntityResolver entityResolver) {
-               if(query instanceof SelectQuery) {
-                       return 
adapter.getSelectTranslator((SelectQuery<?>)query, entityResolver);
-               } else if(query instanceof FluentSelect) {
+               if(query instanceof FluentSelect) {
                        return 
adapter.getSelectTranslator((FluentSelect<?>)query, entityResolver);
                }
                throw new CayenneRuntimeException("Unsupported type of Select 
query %s", query);
diff --git 
a/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/SelectQueryWrapper.java
 
b/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/SelectQueryWrapper.java
deleted file mode 100644
index 3d4ca1e95..000000000
--- 
a/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/SelectQueryWrapper.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    https://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-
-package org.apache.cayenne.access.translator.select;
-
-import java.util.Collection;
-import java.util.Objects;
-
-import org.apache.cayenne.exp.Expression;
-import org.apache.cayenne.exp.property.Property;
-import org.apache.cayenne.map.EntityResolver;
-import org.apache.cayenne.query.Ordering;
-import org.apache.cayenne.query.QueryMetadata;
-import org.apache.cayenne.query.SelectQuery;
-
-/**
- * @since 4.2
- * @deprecated this class should gone with the {@link SelectQuery}
- */
-public class SelectQueryWrapper implements TranslatableQueryWrapper {
-
-    private final SelectQuery<?> selectQuery;
-
-    public SelectQueryWrapper(SelectQuery<?> selectQuery) {
-        this.selectQuery = Objects.requireNonNull(selectQuery);
-    }
-
-    @Override
-    public boolean isDistinct() {
-        return selectQuery.isDistinct();
-    }
-
-    @Override
-    public QueryMetadata getMetaData(EntityResolver resolver) {
-        return selectQuery.getMetaData(resolver);
-    }
-
-    @Override
-    public Expression getQualifier() {
-        return selectQuery.getQualifier();
-    }
-
-    @Override
-    public Collection<Ordering> getOrderings() {
-        return selectQuery.getOrderings();
-    }
-
-    @Override
-    public Collection<Property<?>> getColumns() {
-        return selectQuery.getColumns();
-    }
-
-    @Override
-    public Expression getHavingQualifier() {
-        return selectQuery.getHavingQualifier();
-    }
-
-    @Override
-    public SelectQuery<?> unwrap() {
-        return selectQuery;
-    }
-}
diff --git 
a/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/SelectTranslator.java
 
b/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/SelectTranslator.java
index 2eb745bf3..2090a959c 100644
--- 
a/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/SelectTranslator.java
+++ 
b/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/SelectTranslator.java
@@ -24,10 +24,10 @@ import java.util.Map;
 import org.apache.cayenne.access.jdbc.ColumnDescriptor;
 import org.apache.cayenne.access.translator.DbAttributeBinding;
 import org.apache.cayenne.map.ObjAttribute;
-import org.apache.cayenne.query.SelectQuery;
+import org.apache.cayenne.query.ObjectSelect;
 
 /**
- * An abstraction of {@link SelectQuery} translator.
+ * An abstraction of {@link ObjectSelect} translator.
  * 
  * @since 4.0 this is an interface.
  */
diff --git 
a/cayenne-server/src/main/java/org/apache/cayenne/dba/AutoAdapter.java 
b/cayenne-server/src/main/java/org/apache/cayenne/dba/AutoAdapter.java
index 87d097237..45a374ce4 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/dba/AutoAdapter.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/dba/AutoAdapter.java
@@ -40,7 +40,6 @@ import org.apache.cayenne.map.EntityResolver;
 import org.apache.cayenne.query.FluentSelect;
 import org.apache.cayenne.query.Query;
 import org.apache.cayenne.query.SQLAction;
-import org.apache.cayenne.query.SelectQuery;
 
 /**
  * A DbAdapter that automatically detects the kind of database it is running on
@@ -98,15 +97,6 @@ public class AutoAdapter implements DbAdapter {
                return adapterProvider.get();
        }
 
-       /**
-        * @since 4.0
-        */
-       @Override
-       @Deprecated
-       public SelectTranslator getSelectTranslator(SelectQuery<?> query, 
EntityResolver entityResolver) {
-               return getAdapter().getSelectTranslator(query, entityResolver);
-       }
-
        /**
         * @since 4.2
         */
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/dba/DbAdapter.java 
b/cayenne-server/src/main/java/org/apache/cayenne/dba/DbAdapter.java
index 54e858092..c6bc77394 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/dba/DbAdapter.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/dba/DbAdapter.java
@@ -36,7 +36,6 @@ import org.apache.cayenne.map.EntityResolver;
 import org.apache.cayenne.query.FluentSelect;
 import org.apache.cayenne.query.Query;
 import org.apache.cayenne.query.SQLAction;
-import org.apache.cayenne.query.SelectQuery;
 
 /**
  * A Cayenne extension point that abstracts the differences between specifics 
of
@@ -54,16 +53,6 @@ public interface DbAdapter {
         */
        String getBatchTerminator();
 
-    /**
-     * Returns a SelectTranslator that works with the adapter target database.
-     *
-     * @since 4.0
-     * @deprecated since 4.2 as {@link SelectQuery} is deprecated.
-     * {@link #getSelectTranslator(FluentSelect, EntityResolver)} replaces 
this method.
-     */
-    @Deprecated
-    SelectTranslator getSelectTranslator(SelectQuery<?> query, EntityResolver 
entityResolver);
-
        /**
         * @since 4.2
         */
diff --git 
a/cayenne-server/src/main/java/org/apache/cayenne/dba/JdbcActionBuilder.java 
b/cayenne-server/src/main/java/org/apache/cayenne/dba/JdbcActionBuilder.java
index 35a3b8123..8433e6cd6 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/dba/JdbcActionBuilder.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/dba/JdbcActionBuilder.java
@@ -32,7 +32,6 @@ import org.apache.cayenne.query.ProcedureQuery;
 import org.apache.cayenne.query.SQLAction;
 import org.apache.cayenne.query.SQLActionVisitor;
 import org.apache.cayenne.query.SQLTemplate;
-import org.apache.cayenne.query.SelectQuery;
 
 /**
  * A factory of default SQLActions. Adapters usually subclass 
JdbcActionBuilder to provide
@@ -67,11 +66,6 @@ public class JdbcActionBuilder implements SQLActionVisitor {
         return new ProcedureAction(query, dataNode);
     }
 
-    @Override
-    public <T> SQLAction objectSelectAction(SelectQuery<T> query) {
-        return new SelectAction(query, dataNode);
-    }
-
     /**
      * @since 4.2
      */
diff --git 
a/cayenne-server/src/main/java/org/apache/cayenne/dba/JdbcAdapter.java 
b/cayenne-server/src/main/java/org/apache/cayenne/dba/JdbcAdapter.java
index 4a2359656..5dfc160d4 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/dba/JdbcAdapter.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/dba/JdbcAdapter.java
@@ -54,7 +54,6 @@ import org.apache.cayenne.map.EntityResolver;
 import org.apache.cayenne.query.FluentSelect;
 import org.apache.cayenne.query.Query;
 import org.apache.cayenne.query.SQLAction;
-import org.apache.cayenne.query.SelectQuery;
 import org.apache.cayenne.resource.Resource;
 import org.apache.cayenne.resource.ResourceLocator;
 import org.apache.cayenne.util.Util;
@@ -540,12 +539,6 @@ public class JdbcAdapter implements DbAdapter {
         return query.createSQLAction(new JdbcActionBuilder(node));
     }
 
-    @Override
-    @Deprecated
-    public SelectTranslator getSelectTranslator(SelectQuery<?> query, 
EntityResolver entityResolver) {
-        return new DefaultSelectTranslator(query, this, entityResolver);
-    }
-
     @Override
     public SelectTranslator getSelectTranslator(FluentSelect<?> query, 
EntityResolver entityResolver) {
         return new DefaultSelectTranslator(query, this, entityResolver);
diff --git 
a/cayenne-server/src/main/java/org/apache/cayenne/dba/db2/DB2ActionBuilder.java 
b/cayenne-server/src/main/java/org/apache/cayenne/dba/db2/DB2ActionBuilder.java
index dd0ce9bd0..5ef0f5216 100644
--- 
a/cayenne-server/src/main/java/org/apache/cayenne/dba/db2/DB2ActionBuilder.java
+++ 
b/cayenne-server/src/main/java/org/apache/cayenne/dba/db2/DB2ActionBuilder.java
@@ -23,7 +23,6 @@ import org.apache.cayenne.dba.JdbcActionBuilder;
 import org.apache.cayenne.query.FluentSelect;
 import org.apache.cayenne.query.ProcedureQuery;
 import org.apache.cayenne.query.SQLAction;
-import org.apache.cayenne.query.SelectQuery;
 
 /**
  * @since 3.1
@@ -39,11 +38,6 @@ public class DB2ActionBuilder extends JdbcActionBuilder {
         return new DB2ProcedureAction(query, dataNode);
     }
 
-    @Override
-    public <T> SQLAction objectSelectAction(SelectQuery<T> query) {
-        return new DB2SelectAction(query, dataNode);
-    }
-
     /**
      * @since 4.2
      */
diff --git 
a/cayenne-server/src/main/java/org/apache/cayenne/dba/derby/DerbyActionBuilder.java
 
b/cayenne-server/src/main/java/org/apache/cayenne/dba/derby/DerbyActionBuilder.java
index 277190829..46ea873a5 100644
--- 
a/cayenne-server/src/main/java/org/apache/cayenne/dba/derby/DerbyActionBuilder.java
+++ 
b/cayenne-server/src/main/java/org/apache/cayenne/dba/derby/DerbyActionBuilder.java
@@ -23,7 +23,6 @@ import org.apache.cayenne.access.DataNode;
 import org.apache.cayenne.dba.JdbcActionBuilder;
 import org.apache.cayenne.query.FluentSelect;
 import org.apache.cayenne.query.SQLAction;
-import org.apache.cayenne.query.SelectQuery;
 
 /**
  * @since 4.1
@@ -34,11 +33,6 @@ public class DerbyActionBuilder extends JdbcActionBuilder {
         super(dataNode);
     }
 
-    @Override
-    public <T> SQLAction objectSelectAction(SelectQuery<T> query) {
-        return new DerbySelectAction(query, dataNode);
-    }
-
     /**
      * @since 4.2
      */
diff --git 
a/cayenne-server/src/main/java/org/apache/cayenne/dba/firebird/FirebirdActionBuilder.java
 
b/cayenne-server/src/main/java/org/apache/cayenne/dba/firebird/FirebirdActionBuilder.java
index a1d021b54..eca046e53 100644
--- 
a/cayenne-server/src/main/java/org/apache/cayenne/dba/firebird/FirebirdActionBuilder.java
+++ 
b/cayenne-server/src/main/java/org/apache/cayenne/dba/firebird/FirebirdActionBuilder.java
@@ -23,7 +23,6 @@ import org.apache.cayenne.access.DataNode;
 import org.apache.cayenne.dba.JdbcActionBuilder;
 import org.apache.cayenne.query.FluentSelect;
 import org.apache.cayenne.query.SQLAction;
-import org.apache.cayenne.query.SelectQuery;
 
 /**
  * @since 4.1
@@ -34,12 +33,6 @@ public class FirebirdActionBuilder extends JdbcActionBuilder 
{
         super(dataNode);
     }
 
-
-    @Override
-    public <T> SQLAction objectSelectAction(SelectQuery<T> query) {
-        return new FirebirdSelectAction(query, dataNode);
-    }
-
     /**
      * @since 4.2
      */
diff --git 
a/cayenne-server/src/main/java/org/apache/cayenne/dba/h2/H2ActionBuilder.java 
b/cayenne-server/src/main/java/org/apache/cayenne/dba/h2/H2ActionBuilder.java
index a93ba6f7a..37c0a2187 100644
--- 
a/cayenne-server/src/main/java/org/apache/cayenne/dba/h2/H2ActionBuilder.java
+++ 
b/cayenne-server/src/main/java/org/apache/cayenne/dba/h2/H2ActionBuilder.java
@@ -23,7 +23,6 @@ import org.apache.cayenne.access.DataNode;
 import org.apache.cayenne.dba.JdbcActionBuilder;
 import org.apache.cayenne.query.FluentSelect;
 import org.apache.cayenne.query.SQLAction;
-import org.apache.cayenne.query.SelectQuery;
 
 /**
  * @since 4.1
@@ -33,11 +32,6 @@ public class H2ActionBuilder extends JdbcActionBuilder {
         super(node);
     }
 
-    @Override
-    public <T> SQLAction objectSelectAction(SelectQuery<T> query) {
-        return new H2SelectAction(query, dataNode);
-    }
-
     /**
      * @since 4.2
      */
diff --git 
a/cayenne-server/src/main/java/org/apache/cayenne/dba/hsqldb/HSQLActionBuilder.java
 
b/cayenne-server/src/main/java/org/apache/cayenne/dba/hsqldb/HSQLActionBuilder.java
index b361b8031..75aea976f 100644
--- 
a/cayenne-server/src/main/java/org/apache/cayenne/dba/hsqldb/HSQLActionBuilder.java
+++ 
b/cayenne-server/src/main/java/org/apache/cayenne/dba/hsqldb/HSQLActionBuilder.java
@@ -28,7 +28,6 @@ import org.apache.cayenne.dba.JdbcActionBuilder;
 import org.apache.cayenne.query.FluentSelect;
 import org.apache.cayenne.query.ProcedureQuery;
 import org.apache.cayenne.query.SQLAction;
-import org.apache.cayenne.query.SelectQuery;
 
 class HSQLActionBuilder extends JdbcActionBuilder {
 
@@ -36,11 +35,6 @@ class HSQLActionBuilder extends JdbcActionBuilder {
         super(dataNode);
     }
 
-    @Override
-    public <T> SQLAction objectSelectAction(SelectQuery<T> query) {
-        return new HSQLSelectAction(query, dataNode);
-    }
-
     /**
      * @since 4.2
      */
diff --git 
a/cayenne-server/src/main/java/org/apache/cayenne/dba/ingres/IngresActionBuilder.java
 
b/cayenne-server/src/main/java/org/apache/cayenne/dba/ingres/IngresActionBuilder.java
index bd6d61408..76b874121 100644
--- 
a/cayenne-server/src/main/java/org/apache/cayenne/dba/ingres/IngresActionBuilder.java
+++ 
b/cayenne-server/src/main/java/org/apache/cayenne/dba/ingres/IngresActionBuilder.java
@@ -22,7 +22,6 @@ import org.apache.cayenne.access.DataNode;
 import org.apache.cayenne.dba.JdbcActionBuilder;
 import org.apache.cayenne.query.FluentSelect;
 import org.apache.cayenne.query.SQLAction;
-import org.apache.cayenne.query.SelectQuery;
 
 public class IngresActionBuilder extends JdbcActionBuilder {
 
@@ -33,11 +32,6 @@ public class IngresActionBuilder extends JdbcActionBuilder {
         super(dataNode);
     }
 
-    @Override
-    public <T> SQLAction objectSelectAction(SelectQuery<T> query) {
-        return new IngresSelectAction(query, dataNode);
-    }
-
     /**
      * @since 4.2
      */
diff --git 
a/cayenne-server/src/main/java/org/apache/cayenne/dba/mysql/MySQLActionBuilder.java
 
b/cayenne-server/src/main/java/org/apache/cayenne/dba/mysql/MySQLActionBuilder.java
index bb3fcc643..d446ce35b 100644
--- 
a/cayenne-server/src/main/java/org/apache/cayenne/dba/mysql/MySQLActionBuilder.java
+++ 
b/cayenne-server/src/main/java/org/apache/cayenne/dba/mysql/MySQLActionBuilder.java
@@ -24,7 +24,6 @@ import org.apache.cayenne.dba.JdbcActionBuilder;
 import org.apache.cayenne.query.FluentSelect;
 import org.apache.cayenne.query.ProcedureQuery;
 import org.apache.cayenne.query.SQLAction;
-import org.apache.cayenne.query.SelectQuery;
 
 /**
  * @since 1.2
@@ -35,11 +34,6 @@ class MySQLActionBuilder extends JdbcActionBuilder {
         super(dataNode);
     }
 
-    @Override
-    public <T> SQLAction objectSelectAction(SelectQuery<T> query) {
-        return new MySQLSelectAction(query, dataNode);
-    }
-
     /**
      * @since 4.2
      */
diff --git 
a/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/OracleActionBuilder.java
 
b/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/OracleActionBuilder.java
index 6bd040106..bb033f973 100644
--- 
a/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/OracleActionBuilder.java
+++ 
b/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/OracleActionBuilder.java
@@ -26,7 +26,6 @@ import org.apache.cayenne.query.FluentSelect;
 import org.apache.cayenne.query.ProcedureQuery;
 import org.apache.cayenne.query.SQLAction;
 import org.apache.cayenne.query.SQLTemplate;
-import org.apache.cayenne.query.SelectQuery;
 
 /**
  * @since 1.2
@@ -59,11 +58,6 @@ class OracleActionBuilder extends JdbcActionBuilder {
         return new OracleProcedureAction(query, dataNode);
     }
 
-    @Override
-    public <T> SQLAction objectSelectAction(SelectQuery<T> query) {
-        return new OracleSelectAction(query, dataNode);
-    }
-
     /**
      * @since 4.2
      */
diff --git 
a/cayenne-server/src/main/java/org/apache/cayenne/dba/postgres/PostgresActionBuilder.java
 
b/cayenne-server/src/main/java/org/apache/cayenne/dba/postgres/PostgresActionBuilder.java
index 062b88614..3051c0eb1 100644
--- 
a/cayenne-server/src/main/java/org/apache/cayenne/dba/postgres/PostgresActionBuilder.java
+++ 
b/cayenne-server/src/main/java/org/apache/cayenne/dba/postgres/PostgresActionBuilder.java
@@ -25,7 +25,6 @@ import org.apache.cayenne.query.BatchQuery;
 import org.apache.cayenne.query.FluentSelect;
 import org.apache.cayenne.query.ProcedureQuery;
 import org.apache.cayenne.query.SQLAction;
-import org.apache.cayenne.query.SelectQuery;
 
 /**
  * @since 1.2
@@ -52,11 +51,6 @@ class PostgresActionBuilder extends JdbcActionBuilder {
         return new PostgresProcedureAction(query, dataNode);
     }
 
-    @Override
-    public <T> SQLAction objectSelectAction(SelectQuery<T> query) {
-        return new PostgresSelectAction(query, dataNode);
-    }
-
     /**
      * @since 4.2
      */
diff --git 
a/cayenne-server/src/main/java/org/apache/cayenne/dba/sqlite/SQLiteActionBuilder.java
 
b/cayenne-server/src/main/java/org/apache/cayenne/dba/sqlite/SQLiteActionBuilder.java
index d9f611c42..c2be85d8b 100644
--- 
a/cayenne-server/src/main/java/org/apache/cayenne/dba/sqlite/SQLiteActionBuilder.java
+++ 
b/cayenne-server/src/main/java/org/apache/cayenne/dba/sqlite/SQLiteActionBuilder.java
@@ -23,7 +23,6 @@ import org.apache.cayenne.dba.JdbcActionBuilder;
 import org.apache.cayenne.query.FluentSelect;
 import org.apache.cayenne.query.SQLAction;
 import org.apache.cayenne.query.SQLTemplate;
-import org.apache.cayenne.query.SelectQuery;
 
 /**
  * @since 3.0
@@ -39,14 +38,6 @@ class SQLiteActionBuilder extends JdbcActionBuilder {
         return new SQLiteSQLTemplateAction(query, dataNode);
     }
 
-    /**
-     * @since 4.1
-     */
-    @Override
-    public <T> SQLAction objectSelectAction(SelectQuery<T> query) {
-        return new SQLiteSelectAction(query, dataNode);
-    }
-
     /**
      * @since 4.2
      */
diff --git 
a/cayenne-server/src/main/java/org/apache/cayenne/dba/sqlserver/SQLServerActionBuilder.java
 
b/cayenne-server/src/main/java/org/apache/cayenne/dba/sqlserver/SQLServerActionBuilder.java
index bb82143c4..f7d78452a 100644
--- 
a/cayenne-server/src/main/java/org/apache/cayenne/dba/sqlserver/SQLServerActionBuilder.java
+++ 
b/cayenne-server/src/main/java/org/apache/cayenne/dba/sqlserver/SQLServerActionBuilder.java
@@ -21,7 +21,10 @@ package org.apache.cayenne.dba.sqlserver;
 
 import org.apache.cayenne.access.DataNode;
 import org.apache.cayenne.dba.JdbcActionBuilder;
-import org.apache.cayenne.query.*;
+import org.apache.cayenne.query.BatchQuery;
+import org.apache.cayenne.query.FluentSelect;
+import org.apache.cayenne.query.ProcedureQuery;
+import org.apache.cayenne.query.SQLAction;
 
 /**
  * @since 1.2
@@ -68,14 +71,6 @@ public class SQLServerActionBuilder extends 
JdbcActionBuilder {
                return new SQLServerProcedureAction(query, dataNode);
        }
 
-       /**
-        * @since 4.2
-        */
-       @Override
-       public <T> SQLAction objectSelectAction(SelectQuery<T> query) {
-               return new SQLServerSelectAction(query, dataNode, 
needInMemoryOffset(query));
-       }
-
        /**
         * @since 4.2
         */
@@ -84,11 +79,6 @@ public class SQLServerActionBuilder extends 
JdbcActionBuilder {
                return new SQLServerSelectAction(query, dataNode, 
needInMemoryOffset(query));
        }
 
-       private boolean needInMemoryOffset(SelectQuery<?> query) {
-               return query.getOrderings() == null || 
query.getOrderings().size() == 0
-                               || version == null || version < 12;
-       }
-
        private boolean needInMemoryOffset(FluentSelect<?> query) {
                return query.getOrderings() == null || 
query.getOrderings().size() == 0
                                || version == null || version < 12;
diff --git 
a/cayenne-server/src/main/java/org/apache/cayenne/query/FluentSelectPrefetchRouterAction.java
 
b/cayenne-server/src/main/java/org/apache/cayenne/query/FluentSelectPrefetchRouterAction.java
index 2256e25bf..f72895ac6 100644
--- 
a/cayenne-server/src/main/java/org/apache/cayenne/query/FluentSelectPrefetchRouterAction.java
+++ 
b/cayenne-server/src/main/java/org/apache/cayenne/query/FluentSelectPrefetchRouterAction.java
@@ -30,7 +30,6 @@ import org.apache.cayenne.util.CayenneMapEntry;
 
 /**
  * Preprocessor and router of SelectQuery prefetches.
- * Copy of {@link SelectQueryPrefetchRouterAction}.
  *
  * @since 4.2
  */
diff --git 
a/cayenne-server/src/main/java/org/apache/cayenne/query/ObjectSelect.java 
b/cayenne-server/src/main/java/org/apache/cayenne/query/ObjectSelect.java
index aa2b22c45..58f65624c 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/query/ObjectSelect.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/query/ObjectSelect.java
@@ -40,9 +40,9 @@ import org.apache.cayenne.map.EntityResolver;
 import org.apache.cayenne.map.ObjEntity;
 
 /**
- * A selecting query providing chainable API. This is an alternative to
- * {@link SelectQuery} when you want to use a fluent API. For example, the 
following
- * is a convenient way to return a record:
+ * A selecting query providing chainable API.
+ * <p>
+ * For example, the following is a convenient way to return a record:
  * <pre>
  * {@code
  * Artist a = ObjectSelect
diff --git 
a/cayenne-server/src/main/java/org/apache/cayenne/query/PrefetchSelectQuery.java
 
b/cayenne-server/src/main/java/org/apache/cayenne/query/PrefetchSelectQuery.java
index 08e98f70c..93588f87c 100644
--- 
a/cayenne-server/src/main/java/org/apache/cayenne/query/PrefetchSelectQuery.java
+++ 
b/cayenne-server/src/main/java/org/apache/cayenne/query/PrefetchSelectQuery.java
@@ -31,7 +31,7 @@ import org.apache.cayenne.util.Util;
  * A SelectQuery to perform a prefetch based on another query. Used internally 
by Cayenne
  * and is normally never used directly.
  *
- * @since 4.2 this query extends {@link ObjectSelect} as part of the 
deprecation of the {@link SelectQuery}
+ * @since 4.2 this query extends {@link ObjectSelect}
  */
 public class PrefetchSelectQuery<T> extends ObjectSelect<T> {
 
diff --git 
a/cayenne-server/src/main/java/org/apache/cayenne/query/SQLActionVisitor.java 
b/cayenne-server/src/main/java/org/apache/cayenne/query/SQLActionVisitor.java
index c3dd24039..02c586b13 100644
--- 
a/cayenne-server/src/main/java/org/apache/cayenne/query/SQLActionVisitor.java
+++ 
b/cayenne-server/src/main/java/org/apache/cayenne/query/SQLActionVisitor.java
@@ -37,11 +37,6 @@ public interface SQLActionVisitor {
      */
     SQLAction batchAction(BatchQuery query);
 
-    /**
-     * Creates an action to execute a SelectQuery.
-     */
-    <T> SQLAction objectSelectAction(SelectQuery<T> query);
-
     /**
      * Creates an action to execute a FluentSelect.
      * @since 4.2
diff --git 
a/cayenne-server/src/main/java/org/apache/cayenne/query/SelectQuery.java 
b/cayenne-server/src/main/java/org/apache/cayenne/query/SelectQuery.java
deleted file mode 100644
index 189cb3047..000000000
--- a/cayenne-server/src/main/java/org/apache/cayenne/query/SelectQuery.java
+++ /dev/null
@@ -1,838 +0,0 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    https://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-
-package org.apache.cayenne.query;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.cayenne.DataRow;
-import org.apache.cayenne.ObjectContext;
-import org.apache.cayenne.ResultBatchIterator;
-import org.apache.cayenne.ResultIterator;
-import org.apache.cayenne.ResultIteratorCallback;
-import org.apache.cayenne.exp.Expression;
-import org.apache.cayenne.exp.ExpressionFactory;
-import org.apache.cayenne.exp.property.Property;
-import org.apache.cayenne.map.DbEntity;
-import org.apache.cayenne.map.EntityResolver;
-import org.apache.cayenne.map.ObjEntity;
-
-/**
- * A query that selects persistent objects of a certain type or "raw data" (aka
- * DataRows). Supports expression qualifier, multiple orderings and a number of
- * other parameters that serve as runtime hints to Cayenne on how to optimize
- * the fetch and result processing.
- *
- * @deprecated since 4.2, use {@link org.apache.cayenne.query.ObjectSelect}
- */
-@Deprecated
-public class SelectQuery<T> extends AbstractQuery implements 
ParameterizedQuery, Select<T> {
-
-       private static final long serialVersionUID = 5486418811888197559L;
-
-       public static final String DISTINCT_PROPERTY = 
"cayenne.SelectQuery.distinct";
-       public static final boolean DISTINCT_DEFAULT = false;
-
-       protected Expression qualifier;
-       protected List<Ordering> orderings;
-       protected boolean distinct;
-
-       /**
-        * @since 4.0
-        */
-       protected Collection<Property<?>> columns;
-
-       /**
-        * @since 4.0
-        */
-       protected Expression havingQualifier;
-
-       /**
-        * <p>Flag that indicates whether this query can return single value or
-        * it should always return some complex data (Object[] for now)</p>
-        * <p>Default value is <b>true</b></p>
-        * @since 4.0
-        */
-       protected boolean canReturnScalarValue = true;
-
-       SelectQueryMetadata metaData = new SelectQueryMetadata();
-
-       /**
-        * Creates a SelectQuery that selects objects of a given persistent 
class.
-        * 
-        * @param rootClass
-        *            the Class of objects fetched by this query.
-        * 
-        * @since 4.0
-        */
-       public static <T> SelectQuery<T> query(Class<T> rootClass) {
-               return new SelectQuery<>(rootClass);
-       }
-
-       /**
-        * Creates a SelectQuery that selects objects of a given persistent 
class
-        * that match supplied qualifier.
-        * 
-        * @param rootClass
-        *            the Class of objects fetched by this query.
-        * @param qualifier
-        *            an Expression indicating which objects should be fetched.
-        * 
-        * @since 4.0
-        */
-       public static <T> SelectQuery<T> query(Class<T> rootClass, Expression 
qualifier) {
-               return new SelectQuery<>(rootClass, qualifier);
-       }
-
-       /**
-        * Creates a SelectQuery that selects objects of a given persistent 
class
-        * that match supplied qualifier.
-        * 
-        * @param rootClass
-        *            the Class of objects fetched by this query.
-        * @param qualifier
-        *            an Expression indicating which objects should be fetched.
-        * @param orderings
-        *            defines how to order the results, may be null.
-        * 
-        * @since 4.0
-        */
-       public static <T> SelectQuery<T> query(Class<T> rootClass, Expression 
qualifier, List<? extends Ordering> orderings) {
-               return new SelectQuery<>(rootClass, qualifier, orderings);
-       }
-
-       /**
-        * @since 4.0
-        */
-       public static SelectQuery<DataRow> dataRowQuery(Class<?> rootClass) {
-               // create a query replica that would fetch DataRows
-               SelectQuery<DataRow> query = new SelectQuery<>();
-
-               query.setRoot(rootClass);
-               query.metaData.setFetchingDataRows(true);
-
-               return query;
-       }
-
-       /**
-        * Creates a SelectQuery that selects DataRows that correspond to a 
given
-        * persistent class that match supplied qualifier.
-        * 
-        * @param rootClass
-        *            the Class of objects that correspond to DataRows entity.
-        * @param qualifier
-        *            an Expression indicating which objects should be fetched.
-        * 
-        * @since 4.0
-        */
-       public static SelectQuery<DataRow> dataRowQuery(Class<?> rootClass, 
Expression qualifier) {
-               SelectQuery<DataRow> query = dataRowQuery(rootClass);
-               query.setQualifier(qualifier);
-               return query;
-       }
-
-       /**
-        * @since 4.0
-        */
-       public static SelectQuery<DataRow> dataRowQuery(Class<?> rootClass, 
Expression qualifier, List<Ordering> orderings) {
-               SelectQuery<DataRow> query = dataRowQuery(rootClass, qualifier);
-               query.addOrderings(orderings);
-               return query;
-       }
-
-       /** Creates an empty SelectQuery. */
-       public SelectQuery() {
-       }
-
-       /**
-        * Creates a SelectQuery with null qualifier, for the specifed ObjEntity
-        * 
-        * @param root
-        *            the ObjEntity this SelectQuery is for.
-        */
-       public SelectQuery(ObjEntity root) {
-               this(root, null);
-       }
-
-       /**
-        * Creates a SelectQuery for the specified ObjEntity with the given
-        * qualifier.
-        * 
-        * @param root
-        *            the ObjEntity this SelectQuery is for.
-        * @param qualifier
-        *            an Expression indicating which objects should be fetched
-        */
-       public SelectQuery(ObjEntity root, Expression qualifier) {
-               this(root, qualifier, null);
-       }
-
-       /**
-        * Creates a SelectQuery for the specified ObjEntity with the given
-        * qualifier and orderings.
-        * 
-        * @param root
-        *            the ObjEntity this SelectQuery is for.
-        * @param qualifier
-        *            an Expression indicating which objects should be fetched.
-        * @param orderings
-        *            defines how to order the results, may be null.
-        * @since 3.1
-        */
-       public SelectQuery(ObjEntity root, Expression qualifier, List<? extends 
Ordering> orderings) {
-               this();
-               this.init(root, qualifier);
-               addOrderings(orderings);
-       }
-
-       /**
-        * Creates a SelectQuery that selects all objects of a given persistent
-        * class.
-        * 
-        * @param rootClass
-        *            the Class of objects fetched by this query.
-        */
-       public SelectQuery(Class<T> rootClass) {
-               this(rootClass, null);
-       }
-
-       /**
-        * Creates a SelectQuery that selects objects of a given persistent 
class
-        * that match supplied qualifier.
-        * 
-        * @param rootClass
-        *            the Class of objects fetched by this query.
-        * @param qualifier
-        *            an Expression indicating which objects should be fetched.
-        */
-       public SelectQuery(Class<T> rootClass, Expression qualifier) {
-               this(rootClass, qualifier, null);
-       }
-
-       /**
-        * Creates a SelectQuery that selects objects of a given persistent 
class
-        * that match supplied qualifier.
-        * 
-        * @param rootClass
-        *            the Class of objects fetched by this query.
-        * @param qualifier
-        *            an Expression indicating which objects should be fetched.
-        * @param orderings
-        *            defines how to order the results, may be null.
-        * @since 3.1
-        */
-       public SelectQuery(Class<T> rootClass, Expression qualifier, List<? 
extends Ordering> orderings) {
-               init(rootClass, qualifier);
-               addOrderings(orderings);
-       }
-
-       /**
-        * Creates a SelectQuery for the specified DbEntity.
-        * 
-        * @param root
-        *            the DbEntity this SelectQuery is for.
-        * @since 1.1
-        */
-       public SelectQuery(DbEntity root) {
-               this(root, null);
-       }
-
-       /**
-        * Creates a SelectQuery for the specified DbEntity with the given
-        * qualifier.
-        * 
-        * @param root
-        *            the DbEntity this SelectQuery is for.
-        * @param qualifier
-        *            an Expression indicating which objects should be fetched.
-        * @since 1.1
-        */
-       public SelectQuery(DbEntity root, Expression qualifier) {
-               this(root, qualifier, null);
-       }
-
-       /**
-        * Creates a SelectQuery for the specified DbEntity with the given 
qualifier
-        * and orderings.
-        * 
-        * @param root
-        *            the DbEntity this SelectQuery is for.
-        * @param qualifier
-        *            an Expression indicating which objects should be fetched.
-        * @param orderings
-        *            defines how to order the results, may be null.
-        * @since 3.1
-        */
-       public SelectQuery(DbEntity root, Expression qualifier, List<? extends 
Ordering> orderings) {
-               this();
-               this.init(root, qualifier);
-               addOrderings(orderings);
-       }
-
-       /**
-        * Creates SelectQuery with <code>objEntityName</code> parameter.
-        */
-       public SelectQuery(String objEntityName) {
-               this(objEntityName, null);
-       }
-
-       /**
-        * Creates SelectQuery with <code>objEntityName</code> and
-        * <code>qualifier</code> parameters.
-        */
-       public SelectQuery(String objEntityName, Expression qualifier) {
-               this(objEntityName, qualifier, null);
-       }
-
-       /**
-        * Creates a SelectQuery that selects objects of a given persistent 
class
-        * that match supplied qualifier.
-        * 
-        * @param objEntityName
-        *            the name of the ObjEntity to fetch from.
-        * @param qualifier
-        *            an Expression indicating which objects should be fetched.
-        * @param orderings
-        *            defines how to order the results, may be null.
-        * @since 3.1
-        */
-       public SelectQuery(String objEntityName, Expression qualifier, List<? 
extends Ordering> orderings) {
-               init(objEntityName, qualifier);
-               addOrderings(orderings);
-       }
-
-       private void init(Object root, Expression qualifier) {
-               this.setRoot(root);
-               this.setQualifier(qualifier);
-       }
-
-       @Override
-       public List<T> select(ObjectContext context) {
-               return context.select(this);
-       }
-
-       @Override
-       public T selectOne(ObjectContext context) {
-               return context.selectOne(this);
-       }
-
-       @Override
-       public T selectFirst(ObjectContext context) {
-               setFetchLimit(1);
-               return context.selectFirst(this);
-       }
-
-       @Override
-       public void iterate(ObjectContext context, ResultIteratorCallback<T> 
callback) {
-               context.iterate(this, callback);
-       }
-
-       @Override
-       public ResultIterator<T> iterator(ObjectContext context) {
-               return context.iterator(this);
-       }
-
-       @Override
-       public ResultBatchIterator<T> batchIterator(ObjectContext context, int 
size) {
-               return context.batchIterator(this, size);
-       }
-
-       /**
-        * @since 1.2
-        */
-       @Override
-       public QueryMetadata getMetaData(EntityResolver resolver) {
-               metaData.resolve(root, resolver, this);
-
-               // must force DataRows if DbEntity is fetched
-               if (root instanceof DbEntity) {
-                       QueryMetadataWrapper wrapper = new 
QueryMetadataWrapper(metaData);
-                       
wrapper.override(QueryMetadata.FETCHING_DATA_ROWS_PROPERTY, Boolean.TRUE);
-                       return wrapper;
-               } else {
-                       return metaData;
-               }
-       }
-
-       /**
-        * Routes itself and if there are any prefetches configured, creates
-        * prefetch queries and routes them as well.
-        * 
-        * @since 1.2
-        */
-       @Override
-       public void route(QueryRouter router, EntityResolver resolver, Query 
substitutedQuery) {
-               super.route(router, resolver, substitutedQuery);
-
-               // suppress prefetches for paginated queries.. instead 
prefetches will
-               // be resolved
-               // per row...
-               if (metaData.getPageSize() <= 0) {
-                       routePrefetches(router, resolver);
-               }
-       }
-
-       /**
-        * Creates and routes extra disjoint prefetch queries.
-        * 
-        * @since 1.2
-        */
-       void routePrefetches(QueryRouter router, EntityResolver resolver) {
-               new SelectQueryPrefetchRouterAction().route(this, router, 
resolver);
-       }
-
-       /**
-        * Calls "makeSelect" on the visitor.
-        * 
-        * @since 1.2
-        */
-       @Override
-       public SQLAction createSQLAction(SQLActionVisitor visitor) {
-               return visitor.objectSelectAction(this);
-       }
-
-       /**
-        * Initializes query parameters using a set of properties.
-        * 
-        * @since 1.1
-        */
-       public void initWithProperties(Map<String, ?> properties) {
-
-               // must init defaults even if properties are empty
-               if (properties == null) {
-                       properties = Collections.emptyMap();
-               }
-
-               Object distinct = properties.get(DISTINCT_PROPERTY);
-
-               // init ivars from properties
-               this.distinct = (distinct != null) ? 
"true".equalsIgnoreCase(distinct.toString()) : DISTINCT_DEFAULT;
-
-               metaData.initWithProperties(properties);
-       }
-
-       /**
-        * A shortcut for {@link #queryWithParameters(Map, boolean)}that prunes
-        * parts of qualifier that have no parameter value set.
-        */
-       public SelectQuery<T> queryWithParameters(Map<String, ?> parameters) {
-               return queryWithParameters(parameters, true);
-       }
-
-       /**
-        * Returns a query built using this query as a prototype, using a set of
-        * parameters to build the qualifier.
-        * 
-        * @see org.apache.cayenne.exp.Expression#params(java.util.Map,
-        *      boolean) parameter substitution.
-        */
-       public SelectQuery<T> queryWithParameters(Map<String, ?> parameters, 
boolean pruneMissing) {
-               // create a query replica
-               SelectQuery<T> query = new SelectQuery<>();
-               query.setDistinct(distinct);
-
-               query.metaData.copyFromInfo(this.metaData);
-               query.setRoot(root);
-
-               if (orderings != null) {
-                       query.addOrderings(orderings);
-               }
-
-               // substitute qualifier parameters
-               if (qualifier != null) {
-                       query.setQualifier(qualifier.params(parameters, 
pruneMissing));
-               }
-
-               return query;
-       }
-
-       /**
-        * Creates and returns a new SelectQuery built using this query as a
-        * prototype and substituting qualifier parameters with the values from 
the
-        * map.
-        * 
-        * @since 1.1
-        */
-       public SelectQuery<T> createQuery(Map<String, ?> parameters) {
-               return queryWithParameters(parameters);
-       }
-
-       /**
-        * Adds ordering specification to this query orderings.
-        */
-       public void addOrdering(Ordering ordering) {
-               nonNullOrderings().add(ordering);
-       }
-
-       /**
-        * Adds a list of orderings.
-        */
-       public void addOrderings(Collection<? extends Ordering> orderings) {
-               // If the supplied list of orderings is null, do not attempt to 
add
-               // to the collection (addAll() will NPE otherwise).
-               if (orderings != null) {
-                       nonNullOrderings().addAll(orderings);
-               }
-       }
-
-       /**
-        * Adds ordering specification to this query orderings.
-        * 
-        * @since 3.0
-        */
-       public void addOrdering(String sortPathSpec, SortOrder order) {
-               addOrdering(new Ordering(sortPathSpec, order));
-       }
-
-       /**
-        * Removes ordering.
-        * 
-        * @since 1.1
-        */
-       public void removeOrdering(Ordering ordering) {
-               if (orderings != null) {
-                       orderings.remove(ordering);
-               }
-       }
-
-       /**
-        * Returns a list of orderings used by this query.
-        */
-       public List<Ordering> getOrderings() {
-               return (orderings != null) ? orderings : 
Collections.emptyList();
-       }
-
-       /**
-        * Clears all configured orderings.
-        */
-       public void clearOrderings() {
-               orderings = null;
-       }
-
-       /**
-        * Returns true if this query returns distinct rows.
-        */
-       public boolean isDistinct() {
-               return distinct;
-       }
-
-       /**
-        * Sets <code>distinct</code> property that determines whether this 
query
-        * returns distinct row.
-        */
-       public void setDistinct(boolean distinct) {
-               this.distinct = distinct;
-       }
-
-       /**
-        * Sets <code>distinct</code> property that determines whether this 
query
-        * returns distinct row.
-        */
-       public void setSuppressDistinct(boolean suppressDistinct) {
-               this.metaData.setSuppressingDistinct(suppressDistinct);
-       }
-
-       /**
-        * Adds one or more aliases for the qualifier expression path. Aliases 
serve
-        * to instruct Cayenne to generate separate sets of joins for 
overlapping
-        * paths, that maybe needed for complex conditions. An example of an
-        * <i>implicit</i> splits is this method:
-        * {@link ExpressionFactory#matchAllExp(String, Object...)}.
-        * 
-        * @since 3.0
-        */
-       public void aliasPathSplits(String path, String... aliases) {
-               metaData.addPathSplitAliases(path, aliases);
-       }
-
-       /**
-        * @since 1.2
-        */
-       public PrefetchTreeNode getPrefetchTree() {
-               return metaData.getPrefetchTree();
-       }
-
-       /**
-        * @since 1.2
-        */
-       public void setPrefetchTree(PrefetchTreeNode prefetchTree) {
-               metaData.setPrefetchTree(prefetchTree);
-       }
-
-       /**
-        * Adds a prefetch with specified relationship path to the query.
-        * 
-        * @since 4.0
-        */
-       public void addPrefetch(PrefetchTreeNode prefetchElement) {
-               metaData.mergePrefetch(prefetchElement);
-       }
-
-       /**
-        * Adds a prefetch with specified relationship path to the query.
-        * 
-        * @since 1.2 signature changed to return created PrefetchTreeNode.
-        */
-       public PrefetchTreeNode addPrefetch(String prefetchPath) {
-               return metaData.addPrefetch(prefetchPath, 
PrefetchTreeNode.UNDEFINED_SEMANTICS);
-       }
-
-       /**
-        * Clears all stored prefetch paths.
-        */
-       public void clearPrefetches() {
-               metaData.clearPrefetches();
-       }
-
-       /**
-        * Removes prefetch.
-        * 
-        * @since 1.1
-        */
-       public void removePrefetch(String prefetchPath) {
-               metaData.removePrefetch(prefetchPath);
-       }
-
-       /**
-        * Returns <code>true</code> if this query should produce a list of data
-        * rows as opposed to DataObjects, <code>false</code> for DataObjects. 
This
-        * is a hint to QueryEngine executing this query.
-        */
-       public boolean isFetchingDataRows() {
-               return (root instanceof DbEntity) || 
metaData.isFetchingDataRows();
-       }
-
-       /**
-        * Sets query result type. If <code>flag</code> parameter is
-        * <code>true</code>, then results will be in the form of data rows.
-        * <p>
-        * <i>Note that if the root of this query is a {@link DbEntity}, this
-        * setting has no effect, and data rows are always fetched. </i>
-        * </p>
-        * 
-        * @deprecated since 4.0, use {@link #dataRowQuery(Class, Expression)} 
to
-        *             create DataRow query instead.
-        */
-       public void setFetchingDataRows(boolean flag) {
-               metaData.setFetchingDataRows(flag);
-       }
-
-       /**
-        * Returns the fetchOffset.
-        * 
-        * @since 3.0
-        */
-       public int getFetchOffset() {
-               return metaData.getFetchOffset();
-       }
-
-       /**
-        * Returns the fetchLimit.
-        */
-       public int getFetchLimit() {
-               return metaData.getFetchLimit();
-       }
-
-       /**
-        * Sets the fetchLimit.
-        */
-       public void setFetchLimit(int fetchLimit) {
-               this.metaData.setFetchLimit(fetchLimit);
-       }
-
-       /**
-        * @since 3.0
-        */
-       public void setFetchOffset(int fetchOffset) {
-               this.metaData.setFetchOffset(fetchOffset);
-       }
-
-       /**
-        * Returns <code>pageSize</code> property. See setPageSize for more 
details.
-        */
-       public int getPageSize() {
-               return metaData.getPageSize();
-       }
-
-       /**
-        * Sets <code>pageSize</code> property.
-        * 
-        * By setting a page size, the Collection returned by performing a query
-        * will return <i>hollow</i> DataObjects. This is considerably faster 
and
-        * uses a tiny fraction of the memory compared to a non-paged query when
-        * large numbers of objects are returned in the result. When a hollow
-        * DataObject is accessed all DataObjects on the same page will be 
faulted
-        * into memory. There will be a small delay when faulting objects while 
the
-        * data is fetched from the data source, but otherwise you do not need 
to do
-        * anything special to access data in hollow objects. The first page is
-        * always faulted into memory immediately.
-        * 
-        * @param pageSize
-        *            The pageSize to set
-        */
-       public void setPageSize(int pageSize) {
-               metaData.setPageSize(pageSize);
-       }
-
-       /**
-        * Returns a list that internally stores orderings, creating it on 
demand.
-        * 
-        * @since 1.2
-        */
-       List<Ordering> nonNullOrderings() {
-               if (orderings == null) {
-                       orderings = new ArrayList<>(3);
-               }
-
-               return orderings;
-       }
-
-       /**
-        * Sets statement's fetch size (0 for default size)
-        * 
-        * @since 3.0
-        */
-       public void setStatementFetchSize(int size) {
-               metaData.setStatementFetchSize(size);
-       }
-
-       /**
-        * @return statement's fetch size
-        * @since 3.0
-        */
-       public int getStatementFetchSize() {
-               return metaData.getStatementFetchSize();
-       }
-
-       /**
-        * Sets new query qualifier.
-        */
-       public void setQualifier(Expression qualifier) {
-               this.qualifier = qualifier;
-       }
-
-       /**
-        * Returns query qualifier.
-        */
-       public Expression getQualifier() {
-               return qualifier;
-       }
-
-       /**
-        * Adds specified qualifier to the existing qualifier joining it using
-        * "AND".
-        */
-       public void andQualifier(Expression e) {
-               qualifier = (qualifier != null) ? qualifier.andExp(e) : e;
-       }
-
-       /**
-        * Adds specified qualifier to the existing qualifier joining it using 
"OR".
-        */
-       public void orQualifier(Expression e) {
-               qualifier = (qualifier != null) ? qualifier.orExp(e) : e;
-       }
-
-       /**
-        * @since 4.0
-        * @see SelectQuery#setCanReturnScalarValue(boolean)
-        */
-       public void setColumns(Collection<Property<?>> columns) {
-               this.columns = columns;
-       }
-
-       /**
-        * @since 4.0
-        */
-       public void setColumns(Property<?>... columns) {
-               if(columns == null || columns.length == 0) {
-                       return;
-               }
-               setColumns(Arrays.asList(columns));
-       }
-
-       /**
-        * <p>Flag that indicates whether this query can return single  value or
-        * it should always return some complex data (Object[] for now)</p>
-        * <p>Default value is <b>true</b></p>
-        * @param canReturnScalarValue can this query return single value
-        * @since 4.0
-        * @see SelectQuery#setColumns
-        */
-       public void setCanReturnScalarValue(boolean canReturnScalarValue) {
-               this.canReturnScalarValue = canReturnScalarValue;
-       }
-
-       /**
-        * @return can this query return single value
-        * @since 4.0
-        */
-       public boolean canReturnScalarValue() {
-               return canReturnScalarValue;
-       }
-
-       /**
-        * @since 4.0
-        */
-       public Collection<Property<?>> getColumns() {
-               return columns;
-       }
-
-       /**
-        * Sets new query HAVING qualifier.
-        * @since 4.0
-        */
-       public void setHavingQualifier(Expression qualifier) {
-               this.havingQualifier = qualifier;
-       }
-
-       /**
-        * Returns query HAVING qualifier.
-        * @since 4.0
-        */
-       public Expression getHavingQualifier() {
-               return havingQualifier;
-       }
-
-       /**
-        * Adds specified HAVING qualifier to the existing HAVING qualifier 
joining it using "AND".
-        * @since 4.0
-        */
-       public void andHavingQualifier(Expression e) {
-               havingQualifier = (havingQualifier != null) ? 
havingQualifier.andExp(e) : e;
-       }
-
-       /**
-        * Adds specified HAVING qualifier to the existing HAVING qualifier 
joining it using "OR".
-        * @since 4.0
-        */
-       public void orHavingQualifier(Expression e) {
-               havingQualifier = (havingQualifier != null) ? 
havingQualifier.orExp(e) : e;
-       }
-
-       @Override
-       protected BaseQueryMetadata getBaseMetaData() {
-               return metaData;
-       }
-}
diff --git 
a/cayenne-server/src/main/java/org/apache/cayenne/query/SelectQueryMetadata.java
 
b/cayenne-server/src/main/java/org/apache/cayenne/query/SelectQueryMetadata.java
deleted file mode 100644
index 30b135eec..000000000
--- 
a/cayenne-server/src/main/java/org/apache/cayenne/query/SelectQueryMetadata.java
+++ /dev/null
@@ -1,305 +0,0 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    https://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-package org.apache.cayenne.query;
-
-import org.apache.cayenne.CayenneRuntimeException;
-import org.apache.cayenne.exp.Expression;
-import org.apache.cayenne.exp.TraversalHandler;
-import org.apache.cayenne.exp.property.Property;
-import org.apache.cayenne.map.DefaultEntityResultSegment;
-import org.apache.cayenne.map.DefaultScalarResultSegment;
-import org.apache.cayenne.map.EntityResolver;
-import org.apache.cayenne.map.ObjEntity;
-import org.apache.cayenne.map.ObjRelationship;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * @since 3.0
- * @deprecated since 4.2
- */
-@Deprecated
-class SelectQueryMetadata extends BaseQueryMetadata {
-
-       private static final long serialVersionUID = 7465922769303943945L;
-
-       private static final ScalarResultSegment SCALAR_RESULT_SEGMENT
-                       = new DefaultScalarResultSegment(null, -1);
-       private static final EntityResultSegment ENTITY_RESULT_SEGMENT
-                       = new DefaultEntityResultSegment(null, null, -1);
-       
-       private Map<String, String> pathSplitAliases;
-       private boolean isSingleResultSetMapping;
-       private boolean suppressingDistinct;
-
-       @Override
-       void copyFromInfo(QueryMetadata info) {
-               super.copyFromInfo(info);
-               this.pathSplitAliases = new 
HashMap<>(info.getPathSplitAliases());
-       }
-
-       boolean resolve(Object root, EntityResolver resolver, SelectQuery<?> 
query) {
-
-               if (super.resolve(root, resolver)) {
-                       // generate unique cache key, but only if we are 
caching..
-                       if (cacheStrategy != null && cacheStrategy != 
QueryCacheStrategy.NO_CACHE) {
-                               this.cacheKey = makeCacheKey(query, resolver);
-                       }
-
-                       resolveAutoAliases(query);
-                       buildResultSetMappingForColumns(query, resolver);
-                       isSingleResultSetMapping = query.canReturnScalarValue() 
&& super.isSingleResultSetMapping();
-
-                       return true;
-               }
-
-               return false;
-       }
-
-       private String makeCacheKey(SelectQuery<?> query, EntityResolver 
resolver) {
-
-               // create a unique key based on entity or columns, qualifier, 
ordering, fetch offset and limit
-
-               StringBuilder key = new StringBuilder();
-               // handler to create string out of expressions, created lazily
-               TraversalHandler traversalHandler = null;
-
-               ObjEntity entity = getObjEntity();
-               if (entity != null) {
-                       key.append(entity.getName());
-               } else if (dbEntity != null) {
-                       key.append("db:").append(dbEntity.getName());
-               }
-
-               if(query.getColumns() != null && !query.getColumns().isEmpty()) 
{
-                       traversalHandler = new 
ToCacheKeyTraversalHandler(resolver.getValueObjectTypeRegistry(), key);
-                       for(Property<?> property : query.getColumns()) {
-                               key.append("/c:");
-                               
property.getExpression().traverse(traversalHandler);
-                       }
-               }
-
-               if (query.getQualifier() != null) {
-                       key.append('/');
-                       if(traversalHandler == null) {
-                               traversalHandler = new 
ToCacheKeyTraversalHandler(resolver.getValueObjectTypeRegistry(), key);
-                       }
-                       query.getQualifier().traverse(traversalHandler);
-               }
-
-               if (!query.getOrderings().isEmpty()) {
-                       for (Ordering o : query.getOrderings()) {
-                               key.append('/').append(o.getSortSpecString());
-                               if (!o.isAscending()) {
-                                       key.append(":d");
-                               }
-
-                               if (o.isCaseInsensitive()) {
-                                       key.append(":i");
-                               }
-                       }
-               }
-
-               if (query.getHavingQualifier() != null) {
-                       key.append('/');
-                       if(traversalHandler == null) {
-                               traversalHandler = new 
ToCacheKeyTraversalHandler(resolver.getValueObjectTypeRegistry(), key);
-                       }
-                       query.getHavingQualifier().traverse(traversalHandler);
-               }
-
-               if (query.getFetchOffset() > 0 || query.getFetchLimit() > 0) {
-                       key.append('/');
-                       if (query.getFetchOffset() > 0) {
-                               key.append('o').append(query.getFetchOffset());
-                       }
-                       if (query.getFetchLimit() > 0) {
-                               key.append('l').append(query.getFetchLimit());
-                       }
-               }
-
-               // add prefetch to cache key per CAY-2349
-               if(query.getPrefetchTree() != null) {
-                       query.getPrefetchTree().traverse(new 
ToCacheKeyPrefetchProcessor(key));
-               }
-
-               return key.toString();
-       }
-
-       private void resolveAutoAliases(SelectQuery<?> query) {
-               resolveQualifierAliases(query);
-               resolveColumnsAliases(query);
-        resolveOrderingAliases(query);
-               resolveHavingQualifierAliases(query);
-               // TODO: include aliases in prefetches? flattened attributes?
-       }
-
-       private void resolveQualifierAliases(SelectQuery<?> query) {
-               Expression qualifier = query.getQualifier();
-               if (qualifier != null) {
-                       resolveAutoAliases(qualifier);
-               }
-       }
-
-       private void resolveColumnsAliases(SelectQuery<?> query) {
-        Collection<Property<?>> columns = query.getColumns();
-        if(columns != null) {
-            for(Property<?> property : columns) {
-                Expression propertyExpression = property.getExpression();
-                if(propertyExpression != null) {
-                    resolveAutoAliases(propertyExpression);
-                }
-            }
-        }
-    }
-
-    private void resolveOrderingAliases(SelectQuery<?> query) {
-        List<Ordering> orderings = query.getOrderings();
-        if(orderings != null) {
-            for(Ordering ordering : orderings) {
-                Expression sortSpec = ordering.getSortSpec();
-                if(sortSpec != null) {
-                    resolveAutoAliases(sortSpec);
-                }
-            }
-        }
-    }
-
-    private void resolveHavingQualifierAliases(SelectQuery<?> query) {
-        Expression havingQualifier = query.getHavingQualifier();
-        if(havingQualifier != null) {
-            resolveAutoAliases(havingQualifier);
-        }
-    }
-
-       private void resolveAutoAliases(Expression expression) {
-               Map<String, String> aliases = expression.getPathAliases();
-               if (!aliases.isEmpty()) {
-                       if (pathSplitAliases == null) {
-                               pathSplitAliases = new HashMap<>();
-                       }
-
-                       for(Map.Entry<String, String> entry : 
aliases.entrySet()) {
-                               pathSplitAliases.compute(entry.getKey(), (key, 
value) -> {
-                                       if(value != null && 
!value.equals(entry.getValue())){
-                                               throw new 
CayenneRuntimeException("Can't add the same alias to different path segments.");
-                                       } else {
-                                               return entry.getValue();
-                                       }
-                               });
-                       }
-               }
-
-               int len = expression.getOperandCount();
-               for (int i = 0; i < len; i++) {
-                       Object operand = expression.getOperand(i);
-                       if (operand instanceof Expression) {
-                               resolveAutoAliases((Expression) operand);
-                       }
-               }
-       }
-
-       /**
-        * @since 3.0
-        */
-       @Override
-       public Map<String, String> getPathSplitAliases() {
-               return pathSplitAliases != null ? pathSplitAliases : 
Collections.emptyMap();
-       }
-
-       /**
-        * @since 3.0
-        */
-       public void addPathSplitAliases(String path, String... aliases) {
-               if (aliases == null) {
-                       throw new NullPointerException("Null aliases");
-               }
-
-               if (aliases.length == 0) {
-                       throw new IllegalArgumentException("No aliases 
specified");
-               }
-
-               if (pathSplitAliases == null) {
-                       pathSplitAliases = new HashMap<>();
-               }
-
-               for (String alias : aliases) {
-                       pathSplitAliases.put(alias, path);
-               }
-       }
-
-       /**
-        * Build DB result descriptor, that will be used to read and convert 
raw result of ColumnSelect
-        * @since 4.0
-        */
-       private void buildResultSetMappingForColumns(SelectQuery<?> query, 
EntityResolver resolver) {
-               if(query.getColumns() == null || query.getColumns().isEmpty()) {
-                       return;
-               }
-
-               resultSetMapping = new ArrayList<>(query.getColumns().size());
-               for(Property<?> column : query.getColumns()) {
-                       // for each column we need only to know if it's entity 
or scalar
-                       Expression exp = column.getExpression();
-                       boolean fullObject = false;
-                       if(exp.getType() == Expression.OBJ_PATH) {
-                               // check if this is toOne relation
-                               Object rel = exp.evaluate(getObjEntity());
-                               // it this path is toOne relation, than select 
full object for it
-                               fullObject = rel instanceof ObjRelationship && 
!((ObjRelationship) rel).isToMany();
-                       } else if(exp.getType() == Expression.FULL_OBJECT) {
-                               fullObject = true;
-                       }
-
-                       if(fullObject) {
-                               resultSetMapping.add(ENTITY_RESULT_SEGMENT);
-                       } else {
-                               resultSetMapping.add(SCALAR_RESULT_SEGMENT);
-                       }
-               }
-       }
-
-       /**
-        * @since 4.0
-        */
-       @Override
-       public boolean isSingleResultSetMapping() {
-               return isSingleResultSetMapping;
-       }
-
-       /**
-        * @since 4.0
-        */
-       @Override
-       public boolean isSuppressingDistinct() {
-               return suppressingDistinct;
-       }
-
-       /**
-        * @since 4.0
-        */
-       public void setSuppressingDistinct(boolean suppressingDistinct) {
-               this.suppressingDistinct = suppressingDistinct;
-       }
-}
diff --git 
a/cayenne-server/src/main/java/org/apache/cayenne/query/SelectQueryPrefetchRouterAction.java
 
b/cayenne-server/src/main/java/org/apache/cayenne/query/SelectQueryPrefetchRouterAction.java
deleted file mode 100644
index 032a5b19d..000000000
--- 
a/cayenne-server/src/main/java/org/apache/cayenne/query/SelectQueryPrefetchRouterAction.java
+++ /dev/null
@@ -1,142 +0,0 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    https://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-
-package org.apache.cayenne.query;
-
-import java.util.Iterator;
-
-import org.apache.cayenne.CayenneRuntimeException;
-import org.apache.cayenne.exp.Expression;
-import org.apache.cayenne.map.EntityResolver;
-import org.apache.cayenne.map.ObjRelationship;
-import org.apache.cayenne.reflect.ClassDescriptor;
-import org.apache.cayenne.util.CayenneMapEntry;
-
-/**
- * Preprocessor and router of SelectQuery prefetches.
- * 
- * @since 1.2
- * @deprecated since 4.2 as part of deprecation of SelectQuery
- */
-@Deprecated
-class SelectQueryPrefetchRouterAction implements PrefetchProcessor {
-
-    SelectQuery<?> query;
-    QueryRouter router;
-    EntityResolver resolver;
-    ClassDescriptor classDescriptor;
-
-    /**
-     * Routes query prefetches, but not the query itself.
-     */
-    void route(SelectQuery query, QueryRouter router, EntityResolver resolver) 
{
-        if (!query.isFetchingDataRows() && query.getPrefetchTree() != null) {
-
-            this.query = query;
-            this.router = router;
-            this.resolver = resolver;
-            this.classDescriptor = 
query.getMetaData(resolver).getClassDescriptor();
-
-            query.getPrefetchTree().traverse(this);
-        }
-    }
-
-    public boolean startPhantomPrefetch(PrefetchTreeNode node) {
-        return true;
-    }
-
-    public boolean startDisjointPrefetch(PrefetchTreeNode node) {
-        // don't do anything to root
-        if (node == query.getPrefetchTree()) {
-            return true;
-        }
-
-        String prefetchPath = node.getPath();
-
-        // find last relationship
-        Iterator<CayenneMapEntry> it = 
classDescriptor.getEntity().resolvePathComponents(
-                prefetchPath);
-
-        ObjRelationship relationship = null;
-        while (it.hasNext()) {
-            relationship = (ObjRelationship) it.next();
-        }
-
-        if (relationship == null) {
-            throw new CayenneRuntimeException("Invalid prefetch '%s' for 
entity '%s'"
-                    , prefetchPath, classDescriptor.getEntity().getName());
-        }
-
-        // chain query and entity qualifiers
-        Expression queryQualifier = query.getQualifier();
-
-        Expression entityQualifier = classDescriptor
-                .getEntityInheritanceTree()
-                .qualifierForEntityAndSubclasses();
-
-        if (entityQualifier != null) {
-            queryQualifier = (queryQualifier != null)
-                    ? queryQualifier.andExp(entityQualifier)
-                    : entityQualifier;
-        }
-
-        // create and configure PrefetchSelectQuery
-        PrefetchSelectQuery<?> prefetchQuery = new 
PrefetchSelectQuery<>(prefetchPath, relationship);
-        prefetchQuery.statementFetchSize(query.getStatementFetchSize());
-
-        prefetchQuery.where(classDescriptor.getEntity()
-                .translateToRelatedEntity(queryQualifier, prefetchPath));
-
-        if (relationship.isSourceIndependentFromTargetChange()) {
-            // setup extra result columns to be able to relate result rows to 
the parent
-            // result objects.
-            prefetchQuery.addResultPath("db:" + 
relationship.getReverseDbRelationshipPath());
-        }
-
-        // pass prefetch subtree to enable joint prefetches...
-        prefetchQuery.setPrefetchTree(node);
-
-        // route...
-        prefetchQuery.route(router, resolver, null);
-        return true;
-    }
-
-    public boolean startDisjointByIdPrefetch(PrefetchTreeNode 
prefetchTreeNode) {
-        // simply pass through
-        return true;
-    }
-
-    public boolean startJointPrefetch(PrefetchTreeNode node) {
-        // simply pass through
-        return true;
-    }
-
-    public boolean startUnknownPrefetch(PrefetchTreeNode node) {
-        // don't do anything to root
-        if (node == query.getPrefetchTree()) {
-            return true;
-        }
-
-        // route unknown as disjoint...
-        return startDisjointPrefetch(node);
-    }
-
-    public void finishPrefetch(PrefetchTreeNode node) {
-    }
-}
diff --git 
a/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextSelectQuerySplitAliasesIT.java
 
b/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextSelectQuerySplitAliasesIT.java
deleted file mode 100644
index 51c0d1ad1..000000000
--- 
a/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextSelectQuerySplitAliasesIT.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    https://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-package org.apache.cayenne.access;
-
-import org.apache.cayenne.di.Inject;
-import org.apache.cayenne.exp.ExpressionFactory;
-import org.apache.cayenne.query.SelectQuery;
-import org.apache.cayenne.test.jdbc.DBHelper;
-import org.apache.cayenne.test.jdbc.TableHelper;
-import org.apache.cayenne.testdo.testmap.Artist;
-import org.apache.cayenne.unit.di.server.CayenneProjects;
-import org.apache.cayenne.unit.di.server.ServerCase;
-import org.apache.cayenne.unit.di.server.UseServerRuntime;
-import org.junit.Before;
-import org.junit.Test;
-
-import java.util.List;
-
-import static org.junit.Assert.assertEquals;
-
-/**
- * @deprecated as part of deprecation of SelectQuery
- */
-@Deprecated
-@UseServerRuntime(CayenneProjects.TESTMAP_PROJECT)
-public class DataContextSelectQuerySplitAliasesIT extends ServerCase {
-
-    @Inject
-    private DataContext context;
-
-    @Inject
-    private DBHelper dbHelper;
-
-    private TableHelper tArtist;
-    private TableHelper tPainting;
-
-    @Before
-    public void setUp() throws Exception {
-        tArtist = new TableHelper(dbHelper, "ARTIST");
-        tArtist.setColumns("ARTIST_ID", "ARTIST_NAME");
-
-        tPainting = new TableHelper(dbHelper, "PAINTING");
-        tPainting.setColumns("PAINTING_ID", "ARTIST_ID", "PAINTING_TITLE");
-    }
-
-    private void createTwoArtistsTwoPaintingsDataSet() throws Exception {
-
-        tArtist.insert(1, "AA");
-        tArtist.insert(2, "BB");
-
-        tPainting.insert(1, 1, "X");
-        tPainting.insert(2, 2, "Y");
-    }
-
-    private void createTwoArtistsThreePaintingsDataSet() throws Exception {
-
-        createTwoArtistsTwoPaintingsDataSet();
-        tPainting.insert(3, 2, "X");
-    }
-
-    @Test
-    public void testAliasPathSplits_SinglePath() throws Exception {
-        createTwoArtistsTwoPaintingsDataSet();
-
-        SelectQuery<Artist> query = SelectQuery.query(Artist.class);
-        query.andQualifier(ExpressionFactory.matchExp("p.paintingTitle", "X"));
-
-        query.aliasPathSplits("paintingArray", "p");
-
-        List<Artist> artists = query.select(context);
-        assertEquals(1, artists.size());
-        assertEquals("AA", artists.get(0).getArtistName());
-    }
-
-    @Test
-    public void testAliasPathSplits_SplitJoin() throws Exception {
-        createTwoArtistsThreePaintingsDataSet();
-
-        SelectQuery<Artist> query = SelectQuery.query(Artist.class);
-        query.andQualifier(ExpressionFactory.matchExp("p1.paintingTitle", 
"X"));
-        query.andQualifier(ExpressionFactory.matchExp("p2.paintingTitle", 
"Y"));
-
-        query.aliasPathSplits("paintingArray", "p1", "p2");
-
-        List<Artist> artists = query.select(context);
-        assertEquals(1, artists.size());
-        assertEquals("BB", artists.get(0).getArtistName());
-    }
-}
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/EnumIT.java 
b/cayenne-server/src/test/java/org/apache/cayenne/access/EnumIT.java
index 09b1227e5..86b720d62 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/access/EnumIT.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/access/EnumIT.java
@@ -26,7 +26,6 @@ import org.apache.cayenne.di.Inject;
 import org.apache.cayenne.query.CapsStrategy;
 import org.apache.cayenne.query.ObjectSelect;
 import org.apache.cayenne.query.SQLTemplate;
-import org.apache.cayenne.query.SelectQuery;
 import org.apache.cayenne.test.jdbc.DBHelper;
 import org.apache.cayenne.test.jdbc.TableHelper;
 import org.apache.cayenne.testdo.enum_test.Enum1;
@@ -66,19 +65,6 @@ public class EnumIT extends ServerCase {
         context.commitChanges();
     }
 
-    @Test
-    @Deprecated
-    public void testSelectQuery() throws Exception {
-        createDataSet();
-
-        SelectQuery<EnumEntity> q = new SelectQuery<>(EnumEntity.class);
-        q.andQualifier(EnumEntity.ENUM_ATTRIBUTE.eq(Enum1.one));
-
-        EnumEntity e = (EnumEntity) Cayenne.objectForQuery(context, q);
-        assertNotNull(e);
-        assertSame(Enum1.one, e.getEnumAttribute());
-    }
-
     @Test
     public void testObjectSelect() throws Exception {
         createDataSet();
diff --git 
a/cayenne-server/src/test/java/org/apache/cayenne/access/translator/select/DefaultSelectTranslatorIT.java
 
b/cayenne-server/src/test/java/org/apache/cayenne/access/translator/select/DefaultSelectTranslatorIT.java
index d4f54b24f..0c5b3f693 100644
--- 
a/cayenne-server/src/test/java/org/apache/cayenne/access/translator/select/DefaultSelectTranslatorIT.java
+++ 
b/cayenne-server/src/test/java/org/apache/cayenne/access/translator/select/DefaultSelectTranslatorIT.java
@@ -30,7 +30,6 @@ import org.apache.cayenne.map.DbAttribute;
 import org.apache.cayenne.map.DbEntity;
 import org.apache.cayenne.query.ObjectSelect;
 import org.apache.cayenne.query.PrefetchTreeNode;
-import org.apache.cayenne.query.SelectQuery;
 import org.apache.cayenne.test.jdbc.DBHelper;
 import org.apache.cayenne.testdo.testmap.ArtGroup;
 import org.apache.cayenne.testdo.testmap.Artist;
@@ -237,11 +236,10 @@ public class DefaultSelectTranslatorIT extends ServerCase 
{
         * Tests query creation with "distinct" specified.
         */
        @Test
-       @Deprecated
        public void testCreateSqlString2() throws Exception {
                // query with "distinct" set
-               SelectQuery<Artist> q = new SelectQuery<>(Artist.class);
-               q.setDistinct(true);
+               ObjectSelect<Artist> q = ObjectSelect.query(Artist.class);
+               q.distinct();
 
                String generatedSql = new DefaultSelectTranslator(q, 
dataNode.getAdapter(), dataNode.getEntityResolver()).getSql();
 
diff --git 
a/cayenne-server/src/test/java/org/apache/cayenne/query/SelectQueryCacheKeyIT.java
 
b/cayenne-server/src/test/java/org/apache/cayenne/query/SelectQueryCacheKeyIT.java
deleted file mode 100644
index 84e4e88ed..000000000
--- 
a/cayenne-server/src/test/java/org/apache/cayenne/query/SelectQueryCacheKeyIT.java
+++ /dev/null
@@ -1,222 +0,0 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    https://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-package org.apache.cayenne.query;
-
-import org.apache.cayenne.di.Inject;
-import org.apache.cayenne.exp.ExpressionFactory;
-import org.apache.cayenne.map.EntityResolver;
-import org.apache.cayenne.testdo.testmap.Artist;
-import org.apache.cayenne.testdo.testmap.Painting;
-import org.apache.cayenne.unit.di.server.CayenneProjects;
-import org.apache.cayenne.unit.di.server.ServerCase;
-import org.apache.cayenne.unit.di.server.UseServerRuntime;
-import org.junit.Test;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-
-@Deprecated
-@UseServerRuntime(CayenneProjects.TESTMAP_PROJECT)
-public class SelectQueryCacheKeyIT extends ServerCase {
-
-    @Inject
-    private EntityResolver resolver;
-
-    @Test
-    public void testNoCache() {
-
-        SelectQuery<Artist> query = new SelectQuery<>(Artist.class);
-
-        QueryMetadata md1 = query.getMetaData(resolver);
-        assertEquals(QueryCacheStrategy.NO_CACHE, md1.getCacheStrategy());
-        assertNull(md1.getCacheKey());
-
-        QueryMetadata md2 = query.getMetaData(resolver);
-        assertEquals(QueryCacheStrategy.NO_CACHE, md2.getCacheStrategy());
-        assertNull(md2.getCacheKey());
-    }
-
-    @Test
-    public void testLocalCache() {
-
-        SelectQuery<Artist> query = new SelectQuery<>(Artist.class);
-
-        query.setCacheStrategy(QueryCacheStrategy.LOCAL_CACHE);
-
-        QueryMetadata md1 = query.getMetaData(resolver);
-        assertEquals(QueryCacheStrategy.LOCAL_CACHE, md1.getCacheStrategy());
-        assertNotNull(md1.getCacheKey());
-    }
-
-    @Test
-    public void testUseLocalCache() {
-
-        SelectQuery<Artist> q1 = new SelectQuery<>(Artist.class);
-        q1.useLocalCache();
-
-        QueryMetadata md1 = q1.getMetaData(resolver);
-        assertEquals(QueryCacheStrategy.LOCAL_CACHE, md1.getCacheStrategy());
-        assertNotNull(md1.getCacheKey());
-        assertNull(md1.getCacheGroup());
-        
-        SelectQuery<Artist> q2 = new SelectQuery<>(Artist.class);
-        q2.useLocalCache("g1");
-
-        QueryMetadata md2 = q2.getMetaData(resolver);
-        assertEquals(QueryCacheStrategy.LOCAL_CACHE, md2.getCacheStrategy());
-        assertNotNull(md2.getCacheKey());
-        assertEquals("g1", md2.getCacheGroup());
-    }
-
-    @Test
-    public void testSharedCache() {
-
-        SelectQuery<Artist> query = new SelectQuery<>(Artist.class);
-
-        query.setCacheStrategy(QueryCacheStrategy.SHARED_CACHE);
-
-        QueryMetadata md1 = query.getMetaData(resolver);
-        assertEquals(QueryCacheStrategy.SHARED_CACHE, md1.getCacheStrategy());
-        assertNotNull(md1.getCacheKey());
-    }
-
-    @Test
-    public void testUseSharedCache() {
-
-        SelectQuery<Artist> q1 = new SelectQuery<>(Artist.class);
-        q1.useSharedCache();
-
-        QueryMetadata md1 = q1.getMetaData(resolver);
-        assertEquals(QueryCacheStrategy.SHARED_CACHE, md1.getCacheStrategy());
-        assertNotNull(md1.getCacheKey());
-        assertNull(md1.getCacheGroup());
-        
-        SelectQuery<Artist> q2 = new SelectQuery<>(Artist.class);
-        q2.useSharedCache("g1");
-
-        QueryMetadata md2 = q2.getMetaData(resolver);
-        assertEquals(QueryCacheStrategy.SHARED_CACHE, md2.getCacheStrategy());
-        assertNotNull(md2.getCacheKey());
-        assertEquals("g1", md2.getCacheGroup());
-    }
-
-    @Test
-    public void testNamedQuery() {
-
-        SelectQuery<Artist> query = new SelectQuery<>(Artist.class);
-
-        query.setCacheStrategy(QueryCacheStrategy.SHARED_CACHE);
-
-        QueryMetadata md1 = query.getMetaData(resolver);
-        assertEquals(QueryCacheStrategy.SHARED_CACHE, md1.getCacheStrategy());
-        assertFalse("XYZ".equals(md1.getCacheKey()));
-    }
-
-    @Test
-    public void testUniqueKeyEntity() {
-
-        SelectQuery<Artist> q1 = new SelectQuery<>(Artist.class);
-        q1.setCacheStrategy(QueryCacheStrategy.LOCAL_CACHE);
-
-        SelectQuery<Artist> q2 = new SelectQuery<>(Artist.class);
-        q2.setCacheStrategy(QueryCacheStrategy.LOCAL_CACHE);
-
-        SelectQuery<Painting> q3 = new SelectQuery<>(Painting.class);
-        q3.setCacheStrategy(QueryCacheStrategy.LOCAL_CACHE);
-
-        assertNotNull(q1.getMetaData(resolver).getCacheKey());
-        assertEquals(q1.getMetaData(resolver).getCacheKey(), 
q2.getMetaData(resolver).getCacheKey());
-
-        assertNotEquals(q1.getMetaData(resolver).getCacheKey(), 
q3.getMetaData(resolver).getCacheKey());
-    }
-
-    @Test
-    public void testUniqueKeyQualifier() {
-
-        SelectQuery<Artist> q1 = new SelectQuery<>(Artist.class);
-        q1.setCacheStrategy(QueryCacheStrategy.LOCAL_CACHE);
-        q1.setQualifier(ExpressionFactory.matchExp("a", "b"));
-
-        SelectQuery<Artist> q2 = new SelectQuery<>(Artist.class);
-        q2.setCacheStrategy(QueryCacheStrategy.LOCAL_CACHE);
-        q2.setQualifier(ExpressionFactory.matchExp("a", "b"));
-
-        SelectQuery<Artist> q3 = new SelectQuery<>(Artist.class);
-        q3.setCacheStrategy(QueryCacheStrategy.LOCAL_CACHE);
-        q3.setQualifier(ExpressionFactory.matchExp("a", "c"));
-
-        assertNotNull(q1.getMetaData(resolver).getCacheKey());
-        assertEquals(q1.getMetaData(resolver).getCacheKey(), 
q2.getMetaData(resolver).getCacheKey());
-
-        assertNotEquals(q1.getMetaData(resolver).getCacheKey(), 
q3.getMetaData(resolver).getCacheKey());
-    }
-
-    @Test
-    public void testUniqueKeyFetchLimit() {
-
-        SelectQuery<Artist> q1 = new SelectQuery<>(Artist.class);
-        q1.setCacheStrategy(QueryCacheStrategy.LOCAL_CACHE);
-        q1.setFetchLimit(5);
-
-        SelectQuery<Artist> q2 = new SelectQuery<>(Artist.class);
-        q2.setCacheStrategy(QueryCacheStrategy.LOCAL_CACHE);
-        q2.setFetchLimit(5);
-
-        SelectQuery<Artist> q3 = new SelectQuery<>(Artist.class);
-        q3.setCacheStrategy(QueryCacheStrategy.LOCAL_CACHE);
-        q3.setFetchLimit(6);
-
-        SelectQuery<Artist> q4 = new SelectQuery<>(Artist.class);
-        q4.setCacheStrategy(QueryCacheStrategy.LOCAL_CACHE);
-
-        assertNotNull(q1.getMetaData(resolver).getCacheKey());
-        assertEquals(q1.getMetaData(resolver).getCacheKey(), 
q2.getMetaData(resolver).getCacheKey());
-
-        assertNotEquals(q1.getMetaData(resolver).getCacheKey(), 
q3.getMetaData(resolver).getCacheKey());
-        assertNotEquals(q1.getMetaData(resolver).getCacheKey(), 
q4.getMetaData(resolver).getCacheKey());
-    }
-
-    @Test
-    public void testUniqueKeyHaving() {
-
-        SelectQuery<Artist> q1 = new SelectQuery<>(Artist.class);
-        q1.setCacheStrategy(QueryCacheStrategy.LOCAL_CACHE);
-        q1.setHavingQualifier(ExpressionFactory.expFalse());
-
-        SelectQuery<Artist> q2 = new SelectQuery<>(Artist.class);
-        q2.setCacheStrategy(QueryCacheStrategy.LOCAL_CACHE);
-        q2.setHavingQualifier(ExpressionFactory.expFalse());
-
-        SelectQuery<Artist> q3 = new SelectQuery<>(Artist.class);
-        q3.setCacheStrategy(QueryCacheStrategy.LOCAL_CACHE);
-        q3.setHavingQualifier(ExpressionFactory.expTrue());
-
-        SelectQuery<Artist> q4 = new SelectQuery<>(Artist.class);
-        q4.setCacheStrategy(QueryCacheStrategy.LOCAL_CACHE);
-
-        assertNotNull(q1.getMetaData(resolver).getCacheKey());
-        assertEquals(q1.getMetaData(resolver).getCacheKey(), 
q2.getMetaData(resolver).getCacheKey());
-
-        assertNotEquals(q1.getMetaData(resolver).getCacheKey(), 
q3.getMetaData(resolver).getCacheKey());
-        assertNotEquals(q1.getMetaData(resolver).getCacheKey(), 
q4.getMetaData(resolver).getCacheKey());
-    }
-}
diff --git 
a/cayenne-server/src/test/java/org/apache/cayenne/query/SelectQueryFetchLimitOrderingIT.java
 
b/cayenne-server/src/test/java/org/apache/cayenne/query/SelectQueryFetchLimitOrderingIT.java
deleted file mode 100644
index cf086d929..000000000
--- 
a/cayenne-server/src/test/java/org/apache/cayenne/query/SelectQueryFetchLimitOrderingIT.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    https://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-
-package org.apache.cayenne.query;
-
-import org.apache.cayenne.ObjectContext;
-import org.apache.cayenne.di.Inject;
-import org.apache.cayenne.test.jdbc.DBHelper;
-import org.apache.cayenne.test.jdbc.TableHelper;
-import org.apache.cayenne.testdo.testmap.Artist;
-import org.apache.cayenne.unit.di.server.CayenneProjects;
-import org.apache.cayenne.unit.di.server.ServerCase;
-import org.apache.cayenne.unit.di.server.UseServerRuntime;
-import org.junit.Before;
-import org.junit.Test;
-
-import java.util.List;
-
-import static org.junit.Assert.assertEquals;
-
-@Deprecated
-@UseServerRuntime(CayenneProjects.TESTMAP_PROJECT)
-public class SelectQueryFetchLimitOrderingIT extends ServerCase {
-
-    @Inject
-    protected ObjectContext context;
-
-    @Inject
-    protected DBHelper dbHelper;
-
-    protected TableHelper tArtist;
-
-    @Before
-    public void setUp() throws Exception {
-        tArtist = new TableHelper(dbHelper, "ARTIST");
-        tArtist.setColumns("ARTIST_ID", "ARTIST_NAME");
-    }
-
-    protected void creatArtistsDataSet() throws Exception {
-        tArtist.insert(33001, "c");
-        tArtist.insert(33002, "b");
-        tArtist.insert(33003, "f");
-        tArtist.insert(33004, "d");
-        tArtist.insert(33005, "a");
-        tArtist.insert(33006, "e");
-    }
-
-    @Test
-    public void testOrdering() throws Exception {
-
-        creatArtistsDataSet();
-
-        SelectQuery query = new SelectQuery("Artist");
-        query.addOrdering(Artist.ARTIST_NAME.asc());
-
-        query.setFetchLimit(4);
-
-        List<?> results = context.performQuery(query);
-        assertEquals(4, results.size());
-
-        assertEquals("a", ((Artist) results.get(0)).getArtistName());
-        assertEquals("b", ((Artist) results.get(1)).getArtistName());
-        assertEquals("c", ((Artist) results.get(2)).getArtistName());
-        assertEquals("d", ((Artist) results.get(3)).getArtistName());
-    }
-}
diff --git 
a/cayenne-server/src/test/java/org/apache/cayenne/query/SelectQueryIT.java 
b/cayenne-server/src/test/java/org/apache/cayenne/query/SelectQueryIT.java
deleted file mode 100644
index 4d6f4f313..000000000
--- a/cayenne-server/src/test/java/org/apache/cayenne/query/SelectQueryIT.java
+++ /dev/null
@@ -1,903 +0,0 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    https://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-
-package org.apache.cayenne.query;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertSame;
-import static org.junit.Assert.assertTrue;
-
-import java.sql.Types;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-import org.apache.cayenne.Cayenne;
-import org.apache.cayenne.DataRow;
-import org.apache.cayenne.ObjectContext;
-import org.apache.cayenne.ResultBatchIterator;
-import org.apache.cayenne.ResultIterator;
-import org.apache.cayenne.ResultIteratorCallback;
-import org.apache.cayenne.di.Inject;
-import org.apache.cayenne.exp.Expression;
-import org.apache.cayenne.exp.ExpressionFactory;
-import org.apache.cayenne.map.DbEntity;
-import org.apache.cayenne.map.EntityResolver;
-import org.apache.cayenne.map.ObjEntity;
-import org.apache.cayenne.map.ObjRelationship;
-import org.apache.cayenne.test.jdbc.DBHelper;
-import org.apache.cayenne.test.jdbc.TableHelper;
-import org.apache.cayenne.testdo.testmap.Artist;
-import org.apache.cayenne.testdo.testmap.ArtistExhibit;
-import org.apache.cayenne.testdo.testmap.Exhibit;
-import org.apache.cayenne.testdo.testmap.Gallery;
-import org.apache.cayenne.testdo.testmap.Painting;
-import org.apache.cayenne.unit.UnitDbAdapter;
-import org.apache.cayenne.unit.di.server.CayenneProjects;
-import org.apache.cayenne.unit.di.server.ServerCase;
-import org.apache.cayenne.unit.di.server.UseServerRuntime;
-import org.junit.Before;
-import org.junit.Test;
-
-@Deprecated
-@UseServerRuntime(CayenneProjects.TESTMAP_PROJECT)
-public class SelectQueryIT extends ServerCase {
-
-       @Inject
-       private ObjectContext context;
-
-       @Inject
-       private DBHelper dbHelper;
-
-       @Inject
-       private UnitDbAdapter accessStackAdapter;
-
-       private TableHelper tArtist;
-       private TableHelper tPainting;
-
-       @Before
-       public void before() {
-               this.tArtist = new TableHelper(dbHelper, 
"ARTIST").setColumns("ARTIST_ID", "ARTIST_NAME", "DATE_OF_BIRTH")
-                               .setColumnTypes(Types.BIGINT, Types.CHAR, 
Types.DATE);
-               tPainting = new TableHelper(dbHelper, 
"PAINTING").setColumns("PAINTING_ID", "ARTIST_ID", "PAINTING_TITLE")
-                               .setColumnTypes(Types.INTEGER, Types.BIGINT, 
Types.VARCHAR);
-       }
-
-       protected void createArtistsDataSet() throws Exception {
-
-               long dateBase = System.currentTimeMillis();
-
-               for (int i = 1; i <= 20; i++) {
-                       tArtist.insert(i, "artist" + i, new 
java.sql.Date(dateBase + 10000 * i));
-               }
-       }
-
-       protected void createArtistsWildcardDataSet() throws Exception {
-               tArtist.insert(1, "_X", null);
-               tArtist.insert(2, "Y_", null);
-       }
-
-       @Test
-       public void testSelect_QualfierOnToMany() throws Exception {
-
-               tArtist.insert(1, "A1", new 
java.sql.Date(System.currentTimeMillis()));
-               tPainting.insert(4, 1, "P1");
-               tPainting.insert(5, 1, "P2");
-               tPainting.insert(6, null, "P3");
-
-               List<Artist> objects = SelectQuery.query(Artist.class,
-                               
Artist.PAINTING_ARRAY.dot(Painting.PAINTING_TITLE).like("P%")).select(context);
-
-               // make sure no duplicate objects are returned when matching on 
a
-               // to-many relationship
-               assertEquals(1, objects.size());
-       }
-
-       @Test
-       public void testFetchLimit() throws Exception {
-               createArtistsDataSet();
-
-               SelectQuery<Artist> query = new SelectQuery<>(Artist.class);
-               query.setFetchLimit(7);
-
-               List<?> objects = context.performQuery(query);
-               assertNotNull(objects);
-               assertEquals(7, objects.size());
-       }
-
-       @Test
-       public void testFetchOffset() throws Exception {
-
-               createArtistsDataSet();
-
-               long totalRows = 
ObjectSelect.query(Artist.class).selectCount(context);
-
-               SelectQuery<Artist> query = new SelectQuery<>(Artist.class);
-               query.addOrdering("db:" + Artist.ARTIST_ID_PK_COLUMN, 
SortOrder.ASCENDING);
-               query.setFetchOffset(5);
-               List<Artist> results = context.select(query);
-
-               assertEquals(totalRows - 5, results.size());
-               assertEquals("artist6", results.get(0).getArtistName());
-       }
-
-       @Test
-       public void testDbEntityRoot() throws Exception {
-
-               createArtistsDataSet();
-               DbEntity artistDbEntity = 
context.getEntityResolver().getDbEntity("ARTIST");
-
-               SelectQuery<DataRow> query = new SelectQuery<>(artistDbEntity);
-               List<DataRow> results = context.select(query);
-
-               assertEquals(20, results.size());
-               assertTrue(results.get(0) instanceof DataRow);
-       }
-
-       @Test
-       public void testFetchLimitWithOffset() throws Exception {
-               createArtistsDataSet();
-               SelectQuery<Artist> query = new SelectQuery<>(Artist.class);
-               query.addOrdering("db:" + Artist.ARTIST_ID_PK_COLUMN, 
SortOrder.ASCENDING);
-               query.setFetchOffset(15);
-               query.setFetchLimit(4);
-               List<Artist> results = context.select(query);
-
-               assertEquals(4, results.size());
-               assertEquals("artist16", results.get(0).getArtistName());
-       }
-
-       @Test
-       public void testFetchOffsetWithQualifier() throws Exception {
-               createArtistsDataSet();
-               SelectQuery<Artist> query = new SelectQuery<>(Artist.class);
-               query.setQualifier(ExpressionFactory.exp("db:ARTIST_ID > 3"));
-               query.setFetchOffset(5);
-
-               List<Artist> objects = query.select(context);
-               int size = objects.size();
-
-               SelectQuery<Artist> sizeQ = new SelectQuery<>(Artist.class);
-               sizeQ.setQualifier(ExpressionFactory.exp("db:ARTIST_ID > 3"));
-               List<Artist> objects1 = sizeQ.select(context);
-               int sizeAll = objects1.size();
-               assertEquals(size, sizeAll - 5);
-       }
-
-       @Test
-       public void testFetchLimitWithQualifier() throws Exception {
-               createArtistsDataSet();
-               SelectQuery<Artist> query = new SelectQuery<>(Artist.class);
-               query.setQualifier(ExpressionFactory.exp("db:ARTIST_ID > 3"));
-               query.setFetchLimit(7);
-               List<Artist> objects = query.select(context);
-               assertEquals(7, objects.size());
-       }
-
-       @Test
-       public void testSelectAllObjectsRootEntityName() throws Exception {
-               createArtistsDataSet();
-               SelectQuery<Artist> query = new SelectQuery<>("Artist");
-               List<?> objects = context.performQuery(query);
-               assertEquals(20, objects.size());
-       }
-
-       @Test
-       public void testSelectAllObjectsRootClass() throws Exception {
-               createArtistsDataSet();
-               SelectQuery<Artist> query = new SelectQuery<>(Artist.class);
-               List<?> objects = context.performQuery(query);
-               assertEquals(20, objects.size());
-       }
-
-       @Test
-       public void testSelectAllObjectsRootObjEntity() throws Exception {
-               createArtistsDataSet();
-               ObjEntity artistEntity = 
context.getEntityResolver().getObjEntity(Artist.class);
-               SelectQuery<Artist> query = new SelectQuery<>(artistEntity);
-
-               List<?> objects = context.performQuery(query);
-               assertEquals(20, objects.size());
-       }
-
-       @Test
-       public void testSelectLikeExactMatch() throws Exception {
-               createArtistsDataSet();
-               SelectQuery<Artist> query = new SelectQuery<>(Artist.class);
-               Expression qual = ExpressionFactory.likeExp("artistName", 
"artist1");
-               query.setQualifier(qual);
-               List<?> objects = context.performQuery(query);
-               assertEquals(1, objects.size());
-       }
-
-       @Test
-       public void testSelectNotLikeSingleWildcardMatch() throws Exception {
-               createArtistsDataSet();
-               SelectQuery<Artist> query = new SelectQuery<>(Artist.class);
-               Expression qual = ExpressionFactory.notLikeExp("artistName", 
"artist11%");
-               query.setQualifier(qual);
-               List<?> objects = context.performQuery(query);
-               assertEquals(19, objects.size());
-       }
-
-       @Test
-       public void testSelectNotLikeIgnoreCaseSingleWildcardMatch() throws 
Exception {
-               createArtistsDataSet();
-               SelectQuery<Artist> query = new SelectQuery<>(Artist.class);
-               Expression qual = 
ExpressionFactory.notLikeIgnoreCaseExp("artistName", "aRtIsT11%");
-               query.setQualifier(qual);
-               List<?> objects = context.performQuery(query);
-               assertEquals(19, objects.size());
-       }
-
-       /**
-        * SQL Server failure:
-        * 
http://stackoverflow.com/questions/14962419/is-the-like-operator-case-sensitive-with-ms-sql-server
-        */
-       @Test
-       public void testSelectLikeCaseSensitive() throws Exception {
-               if (!accessStackAdapter.supportsCaseSensitiveLike()) {
-                       return;
-               }
-
-               createArtistsDataSet();
-               SelectQuery<Artist> query = new SelectQuery<>(Artist.class);
-               Expression qual = ExpressionFactory.likeExp("artistName", 
"aRtIsT%");
-               query.setQualifier(qual);
-               List<?> objects = context.performQuery(query);
-               assertEquals(0, objects.size());
-       }
-
-       @Test
-       public void testSelectLikeSingle_WildcardMatch() throws Exception {
-               createArtistsDataSet();
-               SelectQuery<Artist> query = new SelectQuery<>(Artist.class);
-               Expression qual = ExpressionFactory.likeExp("artistName", 
"artist11%");
-               query.setQualifier(qual);
-               List<?> objects = context.performQuery(query);
-               assertEquals(1, objects.size());
-       }
-
-       @Test
-       public void testSelectLikeSingle_WildcardMatchAndEscape() throws 
Exception {
-
-               if(!accessStackAdapter.supportsEscapeInLike()) {
-                       return;
-               }
-
-               createArtistsWildcardDataSet();
-
-               SelectQuery<Artist> query = new SelectQuery<>(Artist.class);
-               query.andQualifier(ExpressionFactory.likeExp("artistName", 
"=_%", '='));
-
-               List<?> objects = context.performQuery(query);
-               assertEquals(1, objects.size());
-       }
-
-       @Test
-       public void testSelectLike_WildcardMatchAndEscape_AndOtherCriteria() 
throws Exception {
-
-               if(!accessStackAdapter.supportsEscapeInLike()) {
-                       return;
-               }
-
-               createArtistsWildcardDataSet();
-
-               // CAY-1978 - combining LIKE..ESCAPE with another clause 
generated bad
-               // syntax
-               SelectQuery<Artist> query = new SelectQuery<>(Artist.class);
-               query.andQualifier(ExpressionFactory.likeExp("artistName", 
"=_%", '='));
-               query.andQualifier(Artist.ARTIST_NAME.eq("_X"));
-
-               List<?> objects = context.performQuery(query);
-               assertEquals(1, objects.size());
-       }
-
-       @Test
-       public void 
testSelectLike_WildcardMatchIgnoreCaseAndEscape_AndOtherCriteria() throws 
Exception {
-
-               if(!accessStackAdapter.supportsEscapeInLike()) {
-                       return;
-               }
-
-               createArtistsWildcardDataSet();
-
-               // CAY-1978 - combining LIKE..ESCAPE with another clause 
generated bad SQL
-               SelectQuery<Artist> query = new SelectQuery<>(Artist.class);
-               
query.andQualifier(ExpressionFactory.likeIgnoreCaseExp("artistName", "=_%", 
'='));
-               query.andQualifier(Artist.ARTIST_NAME.eq("_X"));
-
-               List<?> objects = context.performQuery(query);
-               assertEquals(1, objects.size());
-       }
-
-       @Test
-       public void 
testSelectLike_WildcardMatchAndEscapeMulti_AndOtherCriteria() throws Exception {
-
-               if(!accessStackAdapter.supportsEscapeInLike()) {
-                       return;
-               }
-
-               tArtist.insert(1, "_X_", null);
-               tArtist.insert(2, "_X", null);
-
-               SelectQuery<Artist> query = new SelectQuery<>(Artist.class);
-               query.andQualifier(ExpressionFactory.likeExp("artistName", 
"#_%#_", '#'));
-               query.andQualifier(Artist.ARTIST_NAME.eq("_X_"));
-
-               List<?> objects = context.performQuery(query);
-               assertEquals(1, objects.size());
-       }
-
-       @Test
-       public void testSelectLikeMultiple_WildcardMatch() throws Exception {
-               createArtistsDataSet();
-               SelectQuery<Artist> query = new SelectQuery<>(Artist.class);
-               Expression qual = ExpressionFactory.likeExp("artistName", 
"artist1%");
-               query.setQualifier(qual);
-               List<?> objects = context.performQuery(query);
-               assertEquals(11, objects.size());
-       }
-
-       /**
-        * Test how "like ignore case" works when using uppercase parameter.
-        */
-       @Test
-       public void testSelectLikeIgnoreCaseObjects1() throws Exception {
-               createArtistsDataSet();
-               SelectQuery<Artist> query = new SelectQuery<>(Artist.class);
-               Expression qual = 
ExpressionFactory.likeIgnoreCaseExp("artistName", "ARTIST%");
-               query.setQualifier(qual);
-               List<?> objects = context.performQuery(query);
-               assertEquals(20, objects.size());
-       }
-
-       /** Test how "like ignore case" works when using lowercase parameter. */
-       @Test
-       public void testSelectLikeIgnoreCaseObjects2() throws Exception {
-               createArtistsDataSet();
-               SelectQuery<Artist> query = new SelectQuery<>(Artist.class);
-               Expression qual = 
ExpressionFactory.likeIgnoreCaseExp("artistName", "artist%");
-               query.setQualifier(qual);
-               List<?> objects = context.performQuery(query);
-               assertEquals(20, objects.size());
-       }
-
-       @Test
-       public void testSelectIn() throws Exception {
-               createArtistsDataSet();
-               SelectQuery<Artist> query = new SelectQuery<>(Artist.class);
-               Expression qual = ExpressionFactory.exp("artistName in 
('artist1', 'artist2')");
-               query.setQualifier(qual);
-               List<?> objects = context.performQuery(query);
-               assertEquals(2, objects.size());
-       }
-
-       @Test
-       public void testSelectParameterizedIn() throws Exception {
-               createArtistsDataSet();
-               SelectQuery<Artist> query = new SelectQuery<>(Artist.class);
-               Expression qual = ExpressionFactory.exp("artistName in $list");
-               query.setQualifier(qual);
-               query = 
query.queryWithParameters(Collections.singletonMap("list", new Object[] { 
"artist1", "artist2" }));
-               List<?> objects = context.performQuery(query);
-               assertEquals(2, objects.size());
-       }
-
-       @Test
-       public void testSelectParameterizedEmptyIn() throws Exception {
-               createArtistsDataSet();
-               SelectQuery<Artist> query = new SelectQuery<>(Artist.class);
-               Expression qual = ExpressionFactory.exp("artistName in $list");
-               query.setQualifier(qual);
-               query = 
query.queryWithParameters(Collections.singletonMap("list", new Object[] {}));
-               List<?> objects = context.performQuery(query);
-               assertEquals(0, objects.size());
-       }
-
-       @Test
-       public void testSelectParameterizedEmptyNotIn() throws Exception {
-               createArtistsDataSet();
-               SelectQuery<Artist> query = new SelectQuery<>(Artist.class);
-               Expression qual = ExpressionFactory.exp("artistName not in 
$list");
-               query.setQualifier(qual);
-               query = 
query.queryWithParameters(Collections.singletonMap("list", new Object[] {}));
-               List<?> objects = context.performQuery(query);
-               assertEquals(20, objects.size());
-       }
-
-       @Test
-       public void testSelectEmptyIn() throws Exception {
-               createArtistsDataSet();
-               SelectQuery<Artist> query = new SelectQuery<>(Artist.class);
-               Expression qual = ExpressionFactory.inExp("artistName");
-               query.setQualifier(qual);
-               List<?> objects = context.performQuery(query);
-               assertEquals(0, objects.size());
-       }
-
-       @Test
-       public void testSelectEmptyNotIn() throws Exception {
-               createArtistsDataSet();
-               SelectQuery<Artist> query = new SelectQuery<>(Artist.class);
-               Expression qual = ExpressionFactory.notInExp("artistName");
-               query.setQualifier(qual);
-               List<?> objects = context.performQuery(query);
-               assertEquals(20, objects.size());
-       }
-
-       @Test
-       public void testSelectBooleanTrue() throws Exception {
-               createArtistsDataSet();
-               SelectQuery<Artist> query = new SelectQuery<>(Artist.class);
-               Expression qual = ExpressionFactory.expTrue();
-               qual = qual.andExp(ExpressionFactory.matchExp("artistName", 
"artist1"));
-               query.setQualifier(qual);
-               List<?> objects = context.performQuery(query);
-               assertEquals(1, objects.size());
-       }
-
-       @Test
-       public void testSelectBooleanNotTrueOr() throws Exception {
-               createArtistsDataSet();
-               SelectQuery<Artist> query = new SelectQuery<>(Artist.class);
-               Expression qual = ExpressionFactory.expTrue();
-               qual = qual.notExp();
-               qual = qual.orExp(ExpressionFactory.matchExp("artistName", 
"artist1"));
-               query.setQualifier(qual);
-               List<?> objects = context.performQuery(query);
-               assertEquals(1, objects.size());
-       }
-
-       @Test
-       public void testSelectBooleanFalse() throws Exception {
-               createArtistsDataSet();
-               SelectQuery<Artist> query = new SelectQuery<>(Artist.class);
-               Expression qual = ExpressionFactory.expFalse();
-               qual = qual.andExp(ExpressionFactory.matchExp("artistName", 
"artist1"));
-               query.setQualifier(qual);
-               List<?> objects = context.performQuery(query);
-               assertEquals(0, objects.size());
-       }
-
-       @Test
-       public void testSelectBooleanFalseOr() throws Exception {
-               createArtistsDataSet();
-               SelectQuery<Artist> query = new SelectQuery<>(Artist.class);
-               Expression qual = ExpressionFactory.expFalse();
-               qual = qual.orExp(ExpressionFactory.matchExp("artistName", 
"artist1"));
-               query.setQualifier(qual);
-               List<?> objects = context.performQuery(query);
-               assertEquals(1, objects.size());
-       }
-
-       @Test
-       public void testSelect() throws Exception {
-               createArtistsDataSet();
-
-               SelectQuery<Artist> query = new SelectQuery<>(Artist.class);
-               List<?> objects = query.select(context);
-               assertEquals(20, objects.size());
-       }
-
-       @Test
-       public void testSelectOne() throws Exception {
-               createArtistsDataSet();
-
-               SelectQuery<Artist> query = new SelectQuery<>(Artist.class);
-               Expression qual = ExpressionFactory.matchExp("artistName", 
"artist1");
-               query.setQualifier(qual);
-
-               Artist artist = query.selectOne(context);
-               assertEquals("artist1", artist.getArtistName());
-       }
-
-       @Test
-       public void testSelectFirst() throws Exception {
-               createArtistsDataSet();
-
-               SelectQuery<Artist> query = new SelectQuery<>(Artist.class);
-               query.addOrdering(new Ordering(Artist.ARTIST_NAME.getName()));
-               Artist artist = query.selectFirst(context);
-
-               assertNotNull(artist);
-               assertEquals("artist1", artist.getArtistName());
-       }
-
-       @Test
-       public void testSelectFirstByContext() throws Exception {
-               createArtistsDataSet();
-
-               SelectQuery<Artist> query = new SelectQuery<>(Artist.class);
-               query.addOrdering(new Ordering(Artist.ARTIST_NAME.getName()));
-               Artist artist = context.selectFirst(query);
-
-               assertNotNull(artist);
-               assertEquals("artist1", artist.getArtistName());
-       }
-
-       @Test
-       public void testIterate() throws Exception {
-               createArtistsDataSet();
-
-               SelectQuery<Artist> q1 = new SelectQuery<>(Artist.class);
-               final int[] count = new int[1];
-               q1.iterate(context, new ResultIteratorCallback<Artist>() {
-
-                       @Override
-                       public void next(Artist object) {
-                               assertNotNull(object.getArtistName());
-                               count[0]++;
-                       }
-               });
-
-               assertEquals(20, count[0]);
-       }
-
-       @Test
-       public void testIterator() throws Exception {
-               createArtistsDataSet();
-
-               SelectQuery<Artist> q1 = new SelectQuery<>(Artist.class);
-
-               try (ResultIterator<Artist> it = q1.iterator(context);) {
-                       int count = 0;
-
-                       for (@SuppressWarnings("unused")
-                       Artist a : it) {
-                               count++;
-                       }
-
-                       assertEquals(20, count);
-               }
-       }
-
-       @Test
-       public void testBatchIterator() throws Exception {
-               createArtistsDataSet();
-
-               SelectQuery<Artist> q1 = new SelectQuery<>(Artist.class);
-
-               try (ResultBatchIterator<Artist> it = q1.batchIterator(context, 
5);) {
-                       int count = 0;
-
-                       for (List<Artist> artistList : it) {
-                               count++;
-                               assertEquals(5, artistList.size());
-                       }
-
-                       assertEquals(4, count);
-               }
-       }
-
-       /**
-        * Tests that all queries specified in prefetch are executed in a more
-        * complex prefetch scenario.
-        */
-       @Test
-       public void testRouteWithPrefetches() {
-               EntityResolver resolver = context.getEntityResolver();
-               MockQueryRouter router = new MockQueryRouter();
-
-               SelectQuery<Artist> q = new SelectQuery<>(Artist.class, 
ExpressionFactory.matchExp("artistName", "a"));
-
-               q.route(router, resolver, null);
-               assertEquals(1, router.getQueryCount());
-
-               q.addPrefetch("paintingArray");
-               router.reset();
-               q.route(router, resolver, null);
-               assertEquals(2, router.getQueryCount());
-
-               q.addPrefetch("paintingArray.toGallery");
-               router.reset();
-               q.route(router, resolver, null);
-               assertEquals(3, router.getQueryCount());
-
-               q.addPrefetch("artistExhibitArray.toExhibit");
-               router.reset();
-               q.route(router, resolver, null);
-               assertEquals(4, router.getQueryCount());
-
-               q.removePrefetch("paintingArray");
-               router.reset();
-               q.route(router, resolver, null);
-               assertEquals(3, router.getQueryCount());
-       }
-
-       /**
-        * Tests that all queries specified in prefetch are executed in a more
-        * complex prefetch scenario with no reverse obj relationships.
-        */
-       @Test
-       public void testRouteQueryWithPrefetchesNoReverse() {
-
-               EntityResolver resolver = context.getEntityResolver();
-               ObjEntity paintingEntity = 
resolver.getObjEntity(Painting.class);
-               ObjEntity galleryEntity = resolver.getObjEntity(Gallery.class);
-               ObjEntity artistExhibitEntity = 
resolver.getObjEntity(ArtistExhibit.class);
-               ObjEntity exhibitEntity = resolver.getObjEntity(Exhibit.class);
-               ObjRelationship paintingToArtistRel = 
paintingEntity.getRelationship("toArtist");
-               paintingEntity.removeRelationship("toArtist");
-
-               ObjRelationship galleryToPaintingRel = 
galleryEntity.getRelationship("paintingArray");
-               galleryEntity.removeRelationship("paintingArray");
-
-               ObjRelationship artistExhibitToArtistRel = 
artistExhibitEntity.getRelationship("toArtist");
-               artistExhibitEntity.removeRelationship("toArtist");
-
-               ObjRelationship exhibitToArtistExhibitRel = 
exhibitEntity.getRelationship("artistExhibitArray");
-               exhibitEntity.removeRelationship("artistExhibitArray");
-
-               Expression e = ExpressionFactory.matchExp("artistName", 
"artist1");
-               SelectQuery<Artist> q = new SelectQuery<>(Artist.class, e);
-               q.addPrefetch("paintingArray");
-               q.addPrefetch("paintingArray.toGallery");
-               q.addPrefetch("artistExhibitArray.toExhibit");
-
-               try {
-                       MockQueryRouter router = new MockQueryRouter();
-                       q.route(router, resolver, null);
-                       assertEquals(4, router.getQueryCount());
-               } finally {
-                       paintingEntity.addRelationship(paintingToArtistRel);
-                       galleryEntity.addRelationship(galleryToPaintingRel);
-                       
artistExhibitEntity.addRelationship(artistExhibitToArtistRel);
-                       
exhibitEntity.addRelationship(exhibitToArtistExhibitRel);
-               }
-       }
-
-       /**
-        * Test prefetching with qualifier on the root query being the path to 
the
-        * prefetch.
-        */
-       @Test
-       public void testRouteQueryWithPrefetchesPrefetchExpressionPath() {
-
-               // find the painting not matching the artist (this is the case 
where
-               // such prefetch
-               // at least makes sense)
-               Expression exp = ExpressionFactory.noMatchExp("toArtist", new 
Object());
-
-               SelectQuery<Painting> q = new SelectQuery<>(Painting.class, 
exp);
-               q.addPrefetch("toArtist");
-
-               // test how prefetches are resolved in this case - this was a 
stumbling
-               // block for
-               // a while
-               EntityResolver resolver = context.getEntityResolver();
-               MockQueryRouter router = new MockQueryRouter();
-               q.route(router, resolver, null);
-               assertEquals(2, router.getQueryCount());
-       }
-
-       @Test
-       public void testLeftJoinAndPrefetchToMany() throws Exception {
-               createArtistsDataSet();
-               SelectQuery<Artist> query = new SelectQuery<>(Artist.class, 
ExpressionFactory.matchExp(
-                               "paintingArray+.toGallery", null));
-               query.addPrefetch("artistExhibitArray");
-               context.select(query);
-
-               // TODO: assertions?
-       }
-
-       @Test
-       public void testLeftJoinAndPrefetchToOne() throws Exception {
-               createArtistsDataSet();
-               SelectQuery<Painting> query = new SelectQuery<>(Painting.class, 
ExpressionFactory.matchExp(
-                               "toArtist+.artistName", null));
-               query.addPrefetch("toGallery");
-               context.select(query);
-
-               // TODO: assertions?
-       }
-
-       @Test
-       public void testMatchObject() {
-
-               Artist a1 = context.newObject(Artist.class);
-               a1.setArtistName("a1");
-               Artist a2 = context.newObject(Artist.class);
-               a2.setArtistName("a2");
-               Artist a3 = context.newObject(Artist.class);
-               a3.setArtistName("a3");
-               context.commitChanges();
-
-               SelectQuery<Artist> query = new SelectQuery<>(Artist.class);
-               query.setQualifier(ExpressionFactory.matchExp(a2));
-               Artist result = query.selectOne(context);
-
-               assertSame(a2, result);
-       }
-
-       @Test
-       public void testMatchObjects() {
-
-               Artist a1 = context.newObject(Artist.class);
-               a1.setArtistName("a1");
-               Artist a2 = context.newObject(Artist.class);
-               a2.setArtistName("a2");
-               Artist a3 = context.newObject(Artist.class);
-               a3.setArtistName("a3");
-               context.commitChanges();
-
-               SelectQuery<Artist> query = new SelectQuery<>(Artist.class);
-               query.setQualifier(ExpressionFactory.matchAnyExp(a1, a3));
-               query.addOrdering(Artist.ARTIST_NAME.asc());
-               List<Artist> list = query.select(context);
-
-               assertEquals(list.size(), 2);
-               assertSame(a1, list.get(0));
-               assertSame(a3, list.get(1));
-       }
-
-       @Test
-       public void testMatchByRelatedObject() {
-
-               Artist a1 = context.newObject(Artist.class);
-               a1.setArtistName("a1");
-               Artist a2 = context.newObject(Artist.class);
-               a2.setArtistName("a2");
-               Painting p1 = context.newObject(Painting.class);
-               p1.setPaintingTitle("p1");
-               p1.setToArtist(a1);
-               Painting p2 = context.newObject(Painting.class);
-               p2.setPaintingTitle("p2");
-               p2.setToArtist(a2);
-               context.commitChanges();
-
-               SelectQuery<Painting> query = new SelectQuery<>(Painting.class);
-               query.setQualifier(ExpressionFactory.matchExp("toArtist", a1));
-               assertSame(p1, query.selectOne(context));
-       }
-
-       @Test
-       public void testMatchByRelatedObjectId() {
-
-               Artist a1 = context.newObject(Artist.class);
-               a1.setArtistName("a1");
-               Artist a2 = context.newObject(Artist.class);
-               a2.setArtistName("a2");
-               Painting p1 = context.newObject(Painting.class);
-               p1.setPaintingTitle("p1");
-               p1.setToArtist(a1);
-               Painting p2 = context.newObject(Painting.class);
-               p2.setPaintingTitle("p2");
-               p2.setToArtist(a2);
-               context.commitChanges();
-
-               SelectQuery<Painting> query = new SelectQuery<>(Painting.class);
-               query.setQualifier(ExpressionFactory.matchExp("toArtist", 
a1.getObjectId()));
-               assertSame(p1, query.selectOne(context));
-       }
-
-       @Test
-       public void testMatchByRelatedObjectIdValue() {
-
-               Artist a1 = context.newObject(Artist.class);
-               a1.setArtistName("a1");
-               Artist a2 = context.newObject(Artist.class);
-               a2.setArtistName("a2");
-               Painting p1 = context.newObject(Painting.class);
-               p1.setPaintingTitle("p1");
-               p1.setToArtist(a1);
-               Painting p2 = context.newObject(Painting.class);
-               p2.setPaintingTitle("p2");
-               p2.setToArtist(a2);
-               context.commitChanges();
-
-               SelectQuery<Painting> query = new SelectQuery<>(Painting.class);
-               query.setQualifier(ExpressionFactory.matchExp("toArtist", 
Cayenne.longPKForObject(a1)));
-               assertSame(p1, query.selectOne(context));
-       }
-
-       @Test
-       public void testSelect_WithOrdering() {
-
-               Artist a1 = context.newObject(Artist.class);
-               a1.setArtistName("a1");
-               Artist a2 = context.newObject(Artist.class);
-               a2.setArtistName("a2");
-               Artist a3 = context.newObject(Artist.class);
-               a3.setArtistName("a3");
-               context.commitChanges();
-
-               List<Ordering> orderings = Arrays.asList(new 
Ordering("artistName", SortOrder.ASCENDING));
-               SelectQuery<Artist> query = new SelectQuery<>(Artist.class, 
null, orderings);
-
-               List<Artist> list = context.select(query);
-               assertEquals(list.size(), 3);
-               assertSame(list.get(0), a1);
-               assertSame(list.get(1), a2);
-               assertSame(list.get(2), a3);
-       }
-
-       /**
-        * Tests INs with more than 1000 elements
-        */
-       @Test
-       public void testSelectLongIn() throws Exception {
-               createArtistsDataSet();
-
-               // not all adapters strip INs, so we just make sure query with 
such qualifier fires OK
-               Object[] names = new String[2009];
-               for (int i = 0; i < names.length; i++) {
-                       names[i] = "artist" + (i + 2);
-               }
-
-               SelectQuery<Artist> query = new SelectQuery<>(Artist.class,
-                               ExpressionFactory.inExp("artistName", names));
-               List<Artist> artists = query.select(context);
-               assertEquals(19, artists.size());
-       }
-
-       /**
-        * Tests NOT INs with more than 1000 elements
-        */
-       @Test
-       public void testSelectLongNotIn() throws Exception {
-               // Derby tries to compile SQL into Java bytecode and
-               // fails with max code length limit ...
-               if(!accessStackAdapter.supportsLongIn()) {
-                       return;
-               }
-
-               createArtistsDataSet();
-
-               // not all adapters strip INs, so we just make sure query with 
such qualifier fires OK
-               Object[] names = new String[1001];
-               for (int i = 0; i < names.length; i++) {
-                       names[i] = "artist" + (i + 2);
-               }
-
-               SelectQuery<Artist> query = new SelectQuery<>(Artist.class,
-                               ExpressionFactory.notInExp("artistName", 
names));
-               List<Artist> artists = query.select(context);
-               assertEquals(1, artists.size());
-       }
-
-       @Test
-       public void testCacheOffsetAndLimit() throws Exception {
-               createArtistsDataSet();
-
-               SelectQuery<Artist> query1 = new SelectQuery<>(Artist.class);
-               query1.setCacheStrategy(QueryCacheStrategy.SHARED_CACHE);
-               query1.setFetchOffset(0);
-               query1.setFetchLimit(10);
-               context.performQuery(query1);
-
-               SelectQuery<Artist> query2 = new SelectQuery<>(Artist.class);
-               query2.setCacheStrategy(QueryCacheStrategy.SHARED_CACHE);
-               query2.setFetchOffset(10);
-               query2.setFetchLimit(10);
-               context.performQuery(query2);
-
-               SelectQuery<Artist> query3 = new SelectQuery<>(Artist.class);
-               query3.setCacheStrategy(QueryCacheStrategy.SHARED_CACHE);
-               query3.setFetchOffset(10);
-               query3.setFetchLimit(10);
-               context.performQuery(query3);
-
-               
assertFalse(query1.metaData.getCacheKey().equals(query2.metaData.cacheKey));
-               assertEquals(query2.metaData.getCacheKey(), 
query3.metaData.getCacheKey());
-       }
-}
diff --git 
a/cayenne-server/src/test/java/org/apache/cayenne/query/SelectQueryPrefetchRouterActionIT.java
 
b/cayenne-server/src/test/java/org/apache/cayenne/query/SelectQueryPrefetchRouterActionIT.java
deleted file mode 100644
index addd8ff06..000000000
--- 
a/cayenne-server/src/test/java/org/apache/cayenne/query/SelectQueryPrefetchRouterActionIT.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    https://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-
-package org.apache.cayenne.query;
-
-import org.apache.cayenne.di.Inject;
-import org.apache.cayenne.exp.ExpressionFactory;
-import org.apache.cayenne.map.EntityResolver;
-import org.apache.cayenne.map.ObjEntity;
-import org.apache.cayenne.testdo.testmap.Artist;
-import org.apache.cayenne.testdo.testmap.Gallery;
-import org.apache.cayenne.testdo.testmap.Painting;
-import org.apache.cayenne.unit.di.server.CayenneProjects;
-import org.apache.cayenne.unit.di.server.ServerCase;
-import org.apache.cayenne.unit.di.server.UseServerRuntime;
-import org.junit.Test;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertSame;
-
-@UseServerRuntime(CayenneProjects.TESTMAP_PROJECT)
-@Deprecated
-public class SelectQueryPrefetchRouterActionIT extends ServerCase {
-
-    @Inject
-    private EntityResolver resolver;
-
-    @Test
-    public void testPaintings1() {
-        ObjEntity paintingEntity = resolver.getObjEntity(Painting.class);
-        SelectQuery q = new SelectQuery(Artist.class, 
ExpressionFactory.matchExp("artistName", "abc"));
-        q.addPrefetch(Artist.PAINTING_ARRAY.disjoint());
-
-        SelectQueryPrefetchRouterAction action = new 
SelectQueryPrefetchRouterAction();
-
-        MockQueryRouter router = new MockQueryRouter();
-        action.route(q, router, resolver);
-        assertEquals(1, router.getQueryCount());
-
-        PrefetchSelectQuery prefetch = (PrefetchSelectQuery) 
router.getQueries().get(0);
-
-        assertEquals(paintingEntity.getName(), prefetch.entityName);
-        assertEquals(ExpressionFactory.exp("db:toArtist.ARTIST_NAME = 'abc'"), 
prefetch.getWhere());
-    }
-
-    @Test
-    public void testPrefetchPaintings2() {
-        ObjEntity paintingEntity = resolver.getObjEntity(Painting.class);
-
-        SelectQuery<Artist> q = new SelectQuery<>(Artist.class, 
ExpressionFactory.exp("artistName = 'abc' or artistName = 'xyz'"));
-        q.addPrefetch(Artist.PAINTING_ARRAY.disjoint());
-
-        SelectQueryPrefetchRouterAction action = new 
SelectQueryPrefetchRouterAction();
-
-        MockQueryRouter router = new MockQueryRouter();
-        action.route(q, router, resolver);
-        assertEquals(1, router.getQueryCount());
-
-        PrefetchSelectQuery prefetch = (PrefetchSelectQuery) 
router.getQueries().get(0);
-        assertEquals(paintingEntity.getName(), prefetch.entityName);
-        assertEquals(ExpressionFactory.exp("db:toArtist.ARTIST_NAME = 'abc' or 
db:toArtist.ARTIST_NAME = 'xyz'"),
-                prefetch.getWhere());
-    }
-
-    @Test
-    public void testGalleries() {
-        ObjEntity galleryEntity = resolver.getObjEntity(Gallery.class);
-        SelectQuery q = new SelectQuery(Artist.class, 
ExpressionFactory.matchExp("artistName", "abc"));
-        q.addPrefetch("paintingArray.toGallery");
-
-        SelectQueryPrefetchRouterAction action = new 
SelectQueryPrefetchRouterAction();
-
-        MockQueryRouter router = new MockQueryRouter();
-        action.route(q, router, resolver);
-        assertEquals(1, router.getQueryCount());
-
-        PrefetchSelectQuery prefetch = (PrefetchSelectQuery) 
router.getQueries().get(0);
-
-        assertEquals(galleryEntity.getName(), prefetch.entityName);
-        
assertEquals(ExpressionFactory.exp("db:paintingArray.toArtist.ARTIST_NAME = 
'abc'"), prefetch.getWhere());
-    }
-}
diff --git 
a/cayenne-server/src/test/java/org/apache/cayenne/query/SelectQueryPrefetchRouterActionQualifiedEntityIT.java
 
b/cayenne-server/src/test/java/org/apache/cayenne/query/SelectQueryPrefetchRouterActionQualifiedEntityIT.java
deleted file mode 100644
index 88fb72646..000000000
--- 
a/cayenne-server/src/test/java/org/apache/cayenne/query/SelectQueryPrefetchRouterActionQualifiedEntityIT.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    https://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-
-package org.apache.cayenne.query;
-
-import org.apache.cayenne.di.Inject;
-import org.apache.cayenne.exp.ExpressionFactory;
-import org.apache.cayenne.map.EntityResolver;
-import org.apache.cayenne.map.ObjEntity;
-import org.apache.cayenne.testdo.inheritance_people.Department;
-import org.apache.cayenne.testdo.inheritance_people.Employee;
-import org.apache.cayenne.testdo.inheritance_people.Manager;
-import org.apache.cayenne.unit.di.server.PeopleProjectCase;
-import org.junit.Test;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertSame;
-
-@Deprecated
-public class SelectQueryPrefetchRouterActionQualifiedEntityIT extends 
PeopleProjectCase {
-
-    @Inject
-    private EntityResolver resolver;
-
-    @Test
-    public void testPrefetchEmployee() throws Exception {
-        ObjEntity departmentEntity = resolver.getObjEntity(Department.class);
-        SelectQuery q = new SelectQuery(Employee.class, 
ExpressionFactory.matchExp("name", "abc"));
-
-        q.addPrefetch(Employee.TO_DEPARTMENT.disjoint());
-
-        SelectQueryPrefetchRouterAction action = new 
SelectQueryPrefetchRouterAction();
-
-        MockQueryRouter router = new MockQueryRouter();
-        action.route(q, router, resolver);
-        assertEquals(1, router.getQueryCount());
-
-        PrefetchSelectQuery prefetch = (PrefetchSelectQuery) 
router.getQueries().get(0);
-
-        assertEquals(departmentEntity.getName(), prefetch.getEntityName());
-        assertEquals(ExpressionFactory.exp("db:employees.NAME = 'abc' and 
(db:employees.PERSON_TYPE = 'EE' "
-                + "or db:employees.PERSON_TYPE = 'EM')"), prefetch.getWhere());
-    }
-
-    @Test
-    public void testPrefetchManager() throws Exception {
-        ObjEntity departmentEntity = resolver.getObjEntity(Department.class);
-        SelectQuery q = new SelectQuery(Manager.class, 
ExpressionFactory.matchExp("name", "abc"));
-
-        q.addPrefetch(Employee.TO_DEPARTMENT.disjoint());
-
-        SelectQueryPrefetchRouterAction action = new 
SelectQueryPrefetchRouterAction();
-
-        MockQueryRouter router = new MockQueryRouter();
-        action.route(q, router, resolver);
-        assertEquals(1, router.getQueryCount());
-
-        PrefetchSelectQuery prefetch = (PrefetchSelectQuery) 
router.getQueries().get(0);
-        assertEquals(departmentEntity.getName(), prefetch.getEntityName());
-        assertEquals(ExpressionFactory.exp("db:employees.NAME = 'abc' and 
db:employees.PERSON_TYPE = 'EM'"),
-                prefetch.getWhere());
-    }
-}
diff --git 
a/cayenne-server/src/test/java/org/apache/cayenne/query/SelectQueryTest.java 
b/cayenne-server/src/test/java/org/apache/cayenne/query/SelectQueryTest.java
deleted file mode 100644
index 8d04906a3..000000000
--- a/cayenne-server/src/test/java/org/apache/cayenne/query/SelectQueryTest.java
+++ /dev/null
@@ -1,180 +0,0 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    https://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-
-package org.apache.cayenne.query;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertSame;
-import static org.junit.Assert.assertTrue;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.cayenne.exp.Expression;
-import org.apache.cayenne.exp.ExpressionFactory;
-import org.apache.cayenne.exp.ExpressionParameter;
-import org.apache.cayenne.testdo.testmap.Artist;
-import org.junit.Before;
-import org.junit.Test;
-
-@Deprecated
-public class SelectQueryTest {
-
-       private SelectQuery<?> query;
-
-       @Before
-       public void before() {
-               this.query = new SelectQuery<Object>();
-       }
-
-       @Test
-       public void testAddPrefetch() {
-
-               assertNull(query.getPrefetchTree());
-               query.addPrefetch("a.b.c");
-               assertNotNull(query.getPrefetchTree());
-               assertEquals(1, 
query.getPrefetchTree().nonPhantomNodes().size());
-               assertNotNull(query.getPrefetchTree().getNode("a.b.c"));
-       }
-
-       @Test
-       public void testAddPrefetchDuplicates() {
-
-               query.addPrefetch("a.b.c");
-               query.addPrefetch("a.b.c");
-
-               assertEquals(1, 
query.getPrefetchTree().nonPhantomNodes().size());
-       }
-
-       @Test
-       public void testClearPrefetches() {
-
-               query.addPrefetch("abc");
-               query.addPrefetch("xyz");
-               assertNotNull(query.getPrefetchTree());
-
-               query.clearPrefetches();
-               assertNull(query.getPrefetchTree());
-       }
-
-       @Test
-       public void testPageSize() throws Exception {
-               query.setPageSize(10);
-               assertEquals(10, query.getPageSize());
-       }
-
-       @Test
-       public void testAddOrdering1() throws Exception {
-               Ordering ord = new Ordering();
-               query.addOrdering(ord);
-               assertEquals(1, query.getOrderings().size());
-               assertSame(ord, query.getOrderings().get(0));
-       }
-
-       @Test
-       public void testAddOrdering2() throws Exception {
-               String path = "a.b.c";
-               query.addOrdering(path, SortOrder.DESCENDING);
-               assertEquals(1, query.getOrderings().size());
-
-               Ordering ord = query.getOrderings().get(0);
-               assertEquals(path, ord.getSortSpec().getOperand(0));
-               assertEquals(false, ord.isAscending());
-       }
-
-       @Test
-       public void testDistinct() throws Exception {
-               assertFalse(query.isDistinct());
-               query.setDistinct(true);
-               assertTrue(query.isDistinct());
-       }
-
-       @Test
-       public void testQueryWithParams1() {
-               query.setRoot(Artist.class);
-               query.setDistinct(true);
-
-               SelectQuery<?> q1 = query.queryWithParameters(new 
HashMap<String, Object>(), true);
-               assertSame(query.getRoot(), q1.getRoot());
-               assertEquals(query.isDistinct(), q1.isDistinct());
-               assertNull(q1.getQualifier());
-       }
-
-       @Test
-       public void testQueryWithParams2() throws Exception {
-               query.setRoot(Artist.class);
-
-               List<Expression> list = new ArrayList<Expression>();
-               list.add(ExpressionFactory.matchExp("k1", new 
ExpressionParameter("test1")));
-               list.add(ExpressionFactory.matchExp("k2", new 
ExpressionParameter("test2")));
-               list.add(ExpressionFactory.matchExp("k3", new 
ExpressionParameter("test3")));
-               list.add(ExpressionFactory.matchExp("k4", new 
ExpressionParameter("test4")));
-               query.setQualifier(ExpressionFactory.joinExp(Expression.OR, 
list));
-
-               Map<String, Object> params = new HashMap<String, Object>();
-               params.put("test2", "abc");
-               params.put("test3", "xyz");
-               SelectQuery<?> q1 = query.queryWithParameters(params, true);
-               assertSame(query.getRoot(), q1.getRoot());
-               assertNotNull(q1.getQualifier());
-               assertTrue(q1.getQualifier() != query.getQualifier());
-       }
-       
-       @Test
-       public void testAndQualifier() {
-               assertNull(query.getQualifier());
-
-               Expression e1 = 
ExpressionFactory.expressionOfType(Expression.EQUAL_TO);
-               query.andQualifier(e1);
-               assertSame(e1, query.getQualifier());
-
-               Expression e2 = 
ExpressionFactory.expressionOfType(Expression.NOT_EQUAL_TO);
-               query.andQualifier(e2);
-               assertEquals(Expression.AND, query.getQualifier().getType());
-       }
-
-       @Test
-       public void testOrQualifier() {
-               assertNull(query.getQualifier());
-
-               Expression e1 = 
ExpressionFactory.expressionOfType(Expression.EQUAL_TO);
-               query.orQualifier(e1);
-               assertSame(e1, query.getQualifier());
-
-               Expression e2 = 
ExpressionFactory.expressionOfType(Expression.NOT_EQUAL_TO);
-               query.orQualifier(e2);
-               assertEquals(Expression.OR, query.getQualifier().getType());
-       }
-       
-       @Test
-       public void testSetQualifier() {
-               assertNull(query.getQualifier());
-
-               Expression qual = 
ExpressionFactory.expressionOfType(Expression.AND);
-               query.setQualifier(qual);
-               assertNotNull(query.getQualifier());
-               assertSame(qual, query.getQualifier());
-       }
-}
diff --git 
a/cayenne-server/src/test/java/org/apache/cayenne/query/StatementFetchSizeIT.java
 
b/cayenne-server/src/test/java/org/apache/cayenne/query/StatementFetchSizeIT.java
index e51448a51..ee9207a93 100644
--- 
a/cayenne-server/src/test/java/org/apache/cayenne/query/StatementFetchSizeIT.java
+++ 
b/cayenne-server/src/test/java/org/apache/cayenne/query/StatementFetchSizeIT.java
@@ -35,18 +35,6 @@ public class StatementFetchSizeIT extends ServerCase {
     @Inject
     private ObjectContext context;
 
-    @Deprecated
-    @Test
-    public void testSelectQuery() {
-        SelectQuery<Artist> query = new SelectQuery<>(Artist.class);
-        query.setStatementFetchSize(10);
-
-        assertEquals(10, query
-                .getMetaData(context.getEntityResolver())
-                .getStatementFetchSize());
-        context.performQuery(query);
-    }
-
     @Test
     public void testObjectSelect() {
         ObjectSelect<Artist> query = 
ObjectSelect.query(Artist.class).statementFetchSize(10);
diff --git 
a/cayenne-server/src/test/java/org/apache/cayenne/unit/jira/CAY_115IT.java 
b/cayenne-server/src/test/java/org/apache/cayenne/unit/jira/CAY_115IT.java
index 6acdf4d2a..82e8b9d09 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/unit/jira/CAY_115IT.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/unit/jira/CAY_115IT.java
@@ -24,7 +24,6 @@ import org.apache.cayenne.di.Inject;
 import org.apache.cayenne.exp.Expression;
 import org.apache.cayenne.exp.ExpressionFactory;
 import org.apache.cayenne.query.ObjectSelect;
-import org.apache.cayenne.query.SelectQuery;
 import org.apache.cayenne.test.jdbc.DBHelper;
 import org.apache.cayenne.test.jdbc.TableHelper;
 import org.apache.cayenne.testdo.relationships_clob.ClobMaster;
@@ -82,7 +81,6 @@ public class CAY_115IT extends ServerCase {
     }
 
     @Test
-    @Deprecated
     public void testDistinctClobFetch() throws Exception {
         if (!accessStackAdapter.supportsLobInsertsAsStrings()) {
             return;
@@ -90,12 +88,12 @@ public class CAY_115IT extends ServerCase {
 
         createDistinctClobFetchDataSet();
 
-        SelectQuery<ClobMaster> noDistinct = 
SelectQuery.query(ClobMaster.class);
-        noDistinct.addOrdering(ClobMaster.NAME.asc());
+        ObjectSelect<ClobMaster> noDistinct = 
ObjectSelect.query(ClobMaster.class);
+        noDistinct.orderBy(ClobMaster.NAME.asc());
 
-        SelectQuery<ClobMaster> distinct = SelectQuery.query(ClobMaster.class);
-        distinct.setDistinct(true);
-        distinct.addOrdering(ClobMaster.NAME.asc());
+        ObjectSelect<ClobMaster> distinct = 
ObjectSelect.query(ClobMaster.class);
+        distinct.distinct();
+        distinct.orderBy(ClobMaster.NAME.asc());
 
         List<?> noDistinctResult = context.performQuery(noDistinct);
         List<?> distinctResult = context.performQuery(distinct);
diff --git 
a/docs/asciidoc/cayenne-guide/src/docs/asciidoc/_cayenne-guide/part2/queries/custom.adoc
 
b/docs/asciidoc/cayenne-guide/src/docs/asciidoc/_cayenne-guide/part2/queries/custom.adoc
index 01cb75b12..192a10d49 100644
--- 
a/docs/asciidoc/cayenne-guide/src/docs/asciidoc/_cayenne-guide/part2/queries/custom.adoc
+++ 
b/docs/asciidoc/cayenne-guide/src/docs/asciidoc/_cayenne-guide/part2/queries/custom.adoc
@@ -57,5 +57,5 @@ public class MyDelegatingQuery extends IndirectQuery {
 }
 ----
 
-In fact many internal Cayenne queries are `IndirectQueries`, delegating to 
`SelectQuery` or `SQLTemplate`
+In fact many internal Cayenne queries are `IndirectQueries`, delegating to 
`ObjectSelect` or `SQLTemplate`
 after some preprocessing.
\ No newline at end of file
diff --git 
a/docs/asciidoc/cayenne-guide/src/docs/asciidoc/_cayenne-guide/part2/queries/objectselect.adoc
 
b/docs/asciidoc/cayenne-guide/src/docs/asciidoc/_cayenne-guide/part2/queries/objectselect.adoc
index d60aff319..02eb53268 100644
--- 
a/docs/asciidoc/cayenne-guide/src/docs/asciidoc/_cayenne-guide/part2/queries/objectselect.adoc
+++ 
b/docs/asciidoc/cayenne-guide/src/docs/asciidoc/_cayenne-guide/part2/queries/objectselect.adoc
@@ -14,7 +14,7 @@
 [[select]]
 ==== ObjectSelect
 
-NOTE: `ObjectSelect` supersedes older `SelectQuery`. `SelectQuery` is 
deprecated since 4.2.
+NOTE: `ObjectSelect` supersedes older `SelectQuery`. `SelectQuery` is 
deprecated since 4.2 and removed in 4.3.
 
 ===== Selecting objects
 

Reply via email to