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

asf-gitbox-commits pushed a commit to branch past-M2
in repository https://gitbox.apache.org/repos/asf/cayenne.git

commit 7a915c1d86bc2c15be0d6006aa481aebfa42db21
Author: Andrus Adamchik <[email protected]>
AuthorDate: Sun May 31 15:06:15 2026 -0400

    Translators as stateless services producing immutable TranslatedXyz records
    
            * EJBQL translators
---
 .../java/org/apache/cayenne/access/DataNode.java   | 16 ++++
 .../apache/cayenne/access/jdbc/EJBQLAction.java    |  5 +-
 ...java => DbAdapterDelegatedEJBQLTranslator.java} | 85 ++++++++++------------
 .../translator/ejbql/EJBQLDbPathTranslator.java    | 19 +++--
 .../translator/ejbql/EJBQLTranslationContext.java  | 16 +++-
 ...TranslatorFactory.java => EJBQLTranslator.java} |  8 +-
 ...slatorFactory.java => JdbcEJBQLTranslator.java} |  6 +-
 .../translator/procedure/ProcedureTranslator.java  |  4 +-
 .../access/translator/select/SelectTranslator.java |  4 +-
 .../cayenne/configuration/runtime/CoreModule.java  |  3 +
 .../runtime/DefaultDataNodeFactory.java            |  5 ++
 .../java/org/apache/cayenne/dba/AutoAdapter.java   |  8 +-
 .../java/org/apache/cayenne/dba/DbAdapter.java     | 16 +++-
 .../java/org/apache/cayenne/dba/JdbcAdapter.java   | 49 +++++++------
 .../org/apache/cayenne/dba/db2/DB2Adapter.java     | 14 ++--
 ...nslatorFactory.java => DB2EJBQLTranslator.java} |  4 +-
 .../org/apache/cayenne/dba/derby/DerbyAdapter.java |  8 +-
 ...latorFactory.java => DerbyEJBQLTranslator.java} |  4 +-
 .../cayenne/dba/firebird/FirebirdAdapter.java      |  9 ++-
 ...orFactory.java => FirebirdEJBQLTranslator.java} |  4 +-
 .../java/org/apache/cayenne/dba/h2/H2Adapter.java  |  8 +-
 ...anslatorFactory.java => H2EJBQLTranslator.java} |  4 +-
 .../apache/cayenne/dba/hsqldb/HSQLDBAdapter.java   |  8 +-
 ...slatorFactory.java => HSQLEJBQLTranslator.java} |  4 +-
 .../org/apache/cayenne/dba/mysql/MySQLAdapter.java |  8 +-
 ...latorFactory.java => MySQLEJBQLTranslator.java} |  4 +-
 .../apache/cayenne/dba/oracle/OracleAdapter.java   |  6 +-
 ...atorFactory.java => OracleEJBQLTranslator.java} |  4 +-
 .../cayenne/dba/sqlserver/SQLServerAdapter.java    |  6 +-
 ...rFactory.java => SQLServerEJBQLTranslator.java} |  4 +-
 .../apache/cayenne/dba/sybase/SybaseAdapter.java   |  6 +-
 ...atorFactory.java => SybaseEJBQLTranslator.java} |  4 +-
 .../translator/ejbql/EJBQLSelectTranslatorIT.java  |  6 +-
 .../runtime/DataDomainProviderTest.java            |  3 +
 .../java/org/apache/cayenne/dba/AutoAdapterIT.java |  4 +-
 35 files changed, 206 insertions(+), 160 deletions(-)

diff --git a/cayenne/src/main/java/org/apache/cayenne/access/DataNode.java 
b/cayenne/src/main/java/org/apache/cayenne/access/DataNode.java
index 049e4fc36..3096c520c 100644
--- a/cayenne/src/main/java/org/apache/cayenne/access/DataNode.java
+++ b/cayenne/src/main/java/org/apache/cayenne/access/DataNode.java
@@ -26,6 +26,7 @@ import org.apache.cayenne.access.jdbc.RowDescriptor;
 import org.apache.cayenne.access.jdbc.reader.RowReader;
 import org.apache.cayenne.access.jdbc.reader.RowReaderFactory;
 import org.apache.cayenne.access.translator.batch.BatchTranslator;
+import org.apache.cayenne.access.translator.ejbql.EJBQLTranslator;
 import org.apache.cayenne.access.translator.procedure.ProcedureTranslator;
 import org.apache.cayenne.access.translator.select.SelectTranslator;
 import org.apache.cayenne.access.translator.sqltemplate.SQLTemplateTranslator;
@@ -77,6 +78,7 @@ public class DataNode {
        private BatchTranslator<DeleteBatchQuery> deleteBatchTranslator;
        private SelectTranslator selectTranslator;
        private ProcedureTranslator procedureTranslator;
+       private EJBQLTranslator ejbqlTranslator;
        private SQLTemplateTranslator sqlTemplateTranslator;
 
        TransactionDataSource readThroughDataSource;
@@ -441,6 +443,20 @@ public class DataNode {
                this.procedureTranslator = procedureTranslator;
        }
 
+       /**
+        * @since 5.0
+        */
+       public EJBQLTranslator getEjbqlTranslator() {
+               return ejbqlTranslator;
+       }
+
+       /**
+        * @since 5.0
+        */
+       public void setEjbqlTranslator(EJBQLTranslator ejbqlTranslator) {
+               this.ejbqlTranslator = ejbqlTranslator;
+       }
+
     // a read-through DataSource that ensures returning the same connection
     // within
     // transaction.
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/access/jdbc/EJBQLAction.java 
b/cayenne/src/main/java/org/apache/cayenne/access/jdbc/EJBQLAction.java
index df36695b5..44f4688eb 100644
--- a/cayenne/src/main/java/org/apache/cayenne/access/jdbc/EJBQLAction.java
+++ b/cayenne/src/main/java/org/apache/cayenne/access/jdbc/EJBQLAction.java
@@ -21,7 +21,7 @@ package org.apache.cayenne.access.jdbc;
 import org.apache.cayenne.access.DataNode;
 import org.apache.cayenne.access.OperationObserver;
 import org.apache.cayenne.access.translator.ejbql.EJBQLTranslationContext;
-import org.apache.cayenne.access.translator.ejbql.EJBQLTranslatorFactory;
+import org.apache.cayenne.access.translator.ejbql.EJBQLTranslator;
 import org.apache.cayenne.ejbql.EJBQLBaseVisitor;
 import org.apache.cayenne.ejbql.EJBQLCompiledExpression;
 import org.apache.cayenne.ejbql.EJBQLExpression;
@@ -53,12 +53,13 @@ public class EJBQLAction extends BaseSQLAction {
     @Override
     public void performAction(Connection connection, OperationObserver 
observer) throws Exception {
         EJBQLCompiledExpression compiledExpression = 
query.getExpression(dataNode.getEntityResolver());
-        EJBQLTranslatorFactory translatorFactory = 
dataNode.getAdapter().getEjbqlTranslatorFactory();
+        EJBQLTranslator translatorFactory = dataNode.getEjbqlTranslator();
         EJBQLTranslationContext context = new EJBQLTranslationContext(
                 dataNode.getEntityResolver(),
                 query,
                 compiledExpression,
                 translatorFactory,
+                dataNode.getAdapter(),
                 dataNode.getAdapter().getQuotingStrategy());
 
         compiledExpression.getExpression().visit(new EJBQLBaseVisitor(false) {
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/access/translator/ejbql/JdbcEJBQLTranslatorFactory.java
 
b/cayenne/src/main/java/org/apache/cayenne/access/translator/ejbql/DbAdapterDelegatedEJBQLTranslator.java
similarity index 52%
copy from 
cayenne/src/main/java/org/apache/cayenne/access/translator/ejbql/JdbcEJBQLTranslatorFactory.java
copy to 
cayenne/src/main/java/org/apache/cayenne/access/translator/ejbql/DbAdapterDelegatedEJBQLTranslator.java
index 42c539506..e53e641aa 100644
--- 
a/cayenne/src/main/java/org/apache/cayenne/access/translator/ejbql/JdbcEJBQLTranslatorFactory.java
+++ 
b/cayenne/src/main/java/org/apache/cayenne/access/translator/ejbql/DbAdapterDelegatedEJBQLTranslator.java
@@ -16,89 +16,80 @@
  *  specific language governing permissions and limitations
  *  under the License.
  ****************************************************************/
+
 package org.apache.cayenne.access.translator.ejbql;
 
 import org.apache.cayenne.ejbql.EJBQLExpressionVisitor;
 
 /**
- * A default EJBQLTranslatorFactory.
- * 
- * @since 3.0
+ * An {@link EJBQLTranslator} that resolves the actual translator from {@link 
org.apache.cayenne.dba.DbAdapter#getEjbqlTranslator()}
+ * allowing adapters to customize translation. The adapter is obtained from 
the {@link EJBQLTranslationContext}.
+ *
+ * @since 5.0
  */
-public class JdbcEJBQLTranslatorFactory implements EJBQLTranslatorFactory {
-
-    protected static final String JOIN_APPENDER_KEY = "$JoinAppender";
-    
-    protected boolean caseInsensitive = false;
+public class DbAdapterDelegatedEJBQLTranslator implements EJBQLTranslator {
 
+    @Override
     public EJBQLJoinAppender getJoinAppender(EJBQLTranslationContext context) {
-        EJBQLJoinAppender appender = (EJBQLJoinAppender) context
-                .getAttribute(JOIN_APPENDER_KEY);
-
-        if (appender == null) {
-            appender = new EJBQLJoinAppender(context);
-            context.setAttribute(JOIN_APPENDER_KEY, appender);
-        }
-
-        return appender;
+        return delegate(context).getJoinAppender(context);
     }
 
-    public EJBQLExpressionVisitor getDeleteTranslator(EJBQLTranslationContext 
context) {
-        context.setUsingAliases(false);
-        return new EJBQLDeleteTranslator(context);
+    @Override
+    public EJBQLExpressionVisitor getSelectTranslator(EJBQLTranslationContext 
context) {
+        return delegate(context).getSelectTranslator(context);
     }
 
-    public EJBQLExpressionVisitor getSelectTranslator(EJBQLTranslationContext 
context) {
-        return new EJBQLSelectTranslator(context);
+    @Override
+    public EJBQLExpressionVisitor getDeleteTranslator(EJBQLTranslationContext 
context) {
+        return delegate(context).getDeleteTranslator(context);
     }
 
+    @Override
     public EJBQLExpressionVisitor getUpdateTranslator(EJBQLTranslationContext 
context) {
-        context.setUsingAliases(false);
-        return new EJBQLUpdateTranslator(context);
+        return delegate(context).getUpdateTranslator(context);
     }
 
-    public EJBQLExpressionVisitor getAggregateColumnTranslator(
-            EJBQLTranslationContext context) {
-        return new EJBQLAggregateColumnTranslator(context);
+    @Override
+    public EJBQLExpressionVisitor 
getAggregateColumnTranslator(EJBQLTranslationContext context) {
+        return delegate(context).getAggregateColumnTranslator(context);
     }
 
+    @Override
     public EJBQLExpressionVisitor 
getConditionTranslator(EJBQLTranslationContext context) {
-        context.setCaseInsensitive(caseInsensitive);
-        return new EJBQLConditionTranslator(context);
+        return delegate(context).getConditionTranslator(context);
     }
 
+    @Override
     public EJBQLExpressionVisitor getFromTranslator(EJBQLTranslationContext 
context) {
-        return new EJBQLFromTranslator(context);
+        return delegate(context).getFromTranslator(context);
     }
 
+    @Override
     public EJBQLExpressionVisitor getGroupByTranslator(EJBQLTranslationContext 
context) {
-        return new EJBQLGroupByTranslator(context);
+        return delegate(context).getGroupByTranslator(context);
     }
 
-    public EJBQLExpressionVisitor getIdentifierColumnsTranslator(
-            EJBQLTranslationContext context) {
-        if(context.getMetadata().getPageSize() > 0){
-            return new EJBQLIdColumnsTranslator(context);
-        }
-        else{
-            return new EJBQLIdentifierColumnsTranslator(context);
-        }
+    @Override
+    public EJBQLExpressionVisitor 
getIdentifierColumnsTranslator(EJBQLTranslationContext context) {
+        return delegate(context).getIdentifierColumnsTranslator(context);
     }
 
+    @Override
     public EJBQLExpressionVisitor getOrderByTranslator(EJBQLTranslationContext 
context) {
-        return new EJBQLOrderByTranslator(context);
+        return delegate(context).getOrderByTranslator(context);
     }
 
-    public EJBQLExpressionVisitor getSelectColumnsTranslator(
-            EJBQLTranslationContext context) {
-        return new EJBQLSelectColumnsTranslator(context);
+    @Override
+    public EJBQLExpressionVisitor 
getSelectColumnsTranslator(EJBQLTranslationContext context) {
+        return delegate(context).getSelectColumnsTranslator(context);
     }
 
+    @Override
     public EJBQLExpressionVisitor 
getUpdateItemTranslator(EJBQLTranslationContext context) {
-        return new EJBQLUpdateItemTranslator(context);
+        return delegate(context).getUpdateItemTranslator(context);
     }
-    
-    public void setCaseInsensitive(boolean caseInsensitive) {
-        this.caseInsensitive = caseInsensitive;
+
+    private EJBQLTranslator delegate(EJBQLTranslationContext context) {
+        return context.getAdapter().getEjbqlTranslator();
     }
 }
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/access/translator/ejbql/EJBQLDbPathTranslator.java
 
b/cayenne/src/main/java/org/apache/cayenne/access/translator/ejbql/EJBQLDbPathTranslator.java
index 672c882a1..b90a366bd 100644
--- 
a/cayenne/src/main/java/org/apache/cayenne/access/translator/ejbql/EJBQLDbPathTranslator.java
+++ 
b/cayenne/src/main/java/org/apache/cayenne/access/translator/ejbql/EJBQLDbPathTranslator.java
@@ -25,7 +25,6 @@ import org.apache.cayenne.map.DbAttribute;
 import org.apache.cayenne.map.DbEntity;
 import org.apache.cayenne.map.DbJoin;
 import org.apache.cayenne.map.DbRelationship;
-import org.apache.cayenne.map.Relationship;
 import org.apache.cayenne.reflect.ClassDescriptor;
 
 import java.util.Collection;
@@ -35,7 +34,7 @@ import java.util.Map;
 
 public abstract class EJBQLDbPathTranslator extends EJBQLBaseVisitor {
 
-       private EJBQLTranslationContext context;
+       private final EJBQLTranslationContext context;
        protected DbEntity currentEntity;
        private String lastPathComponent;
        protected String lastAlias;
@@ -121,8 +120,8 @@ public abstract class EJBQLDbPathTranslator extends 
EJBQLBaseVisitor {
                        } else {
                                joinAppender.appendOuterJoin(joinMarker, new 
EJBQLTableId(idPath), new EJBQLTableId(fullPath));
 
-                               Relationship lastRelationship = 
currentEntity.getRelationship(lastPathComponent);
-                               DbEntity targetEntity = (DbEntity) 
lastRelationship.getTargetEntity();
+                               DbRelationship lastRelationship = 
currentEntity.getRelationship(lastPathComponent);
+                               DbEntity targetEntity = 
lastRelationship.getTargetEntity();
 
                                this.lastAlias = context.getTableAlias(fullPath,
                                                
context.getQuotingStrategy().quotedFullyQualifiedName(targetEntity));
@@ -139,7 +138,7 @@ public abstract class EJBQLDbPathTranslator extends 
EJBQLBaseVisitor {
                                        + currentEntity.getName() + "'");
                }
 
-               this.currentEntity = (DbEntity) relationship.getTargetEntity();
+               this.currentEntity = relationship.getTargetEntity();
        }
 
        private void processLastPathComponent() {
@@ -162,7 +161,7 @@ public abstract class EJBQLDbPathTranslator extends 
EJBQLBaseVisitor {
 
        protected void processTerminatingAttribute(DbAttribute attribute) {
 
-               DbEntity table = (DbEntity) attribute.getEntity();
+               DbEntity table = attribute.getEntity();
 
                if (isUsingAliases()) {
                        String alias = this.lastAlias != null ? lastAlias : 
context.getTableAlias(idPath, context
@@ -180,7 +179,7 @@ public abstract class EJBQLDbPathTranslator extends 
EJBQLBaseVisitor {
                        // use an outer join for to-many matches
                        resolveJoin(false);
 
-                       DbEntity table = (DbEntity) 
relationship.getTargetEntity();
+                       DbEntity table = relationship.getTargetEntity();
 
                        String alias = this.lastAlias != null ? lastAlias : 
context.getTableAlias(idPath, context
                                        
.getQuotingStrategy().quotedFullyQualifiedName(table));
@@ -200,7 +199,7 @@ public abstract class EJBQLDbPathTranslator extends 
EJBQLBaseVisitor {
                } else {
                        // match FK against the target object
 
-                       DbEntity table = (DbEntity) 
relationship.getSourceEntity();
+                       DbEntity table = relationship.getSourceEntity();
 
                        String alias = this.lastAlias != null ? lastAlias : 
context.getTableAlias(idPath, context
                                        
.getQuotingStrategy().quotedFullyQualifiedName(table));
@@ -208,7 +207,7 @@ public abstract class EJBQLDbPathTranslator extends 
EJBQLBaseVisitor {
                        List<DbJoin> joins = relationship.getJoins();
 
                        if (joins.size() == 1) {
-                               DbJoin join = joins.get(0);
+                               DbJoin join = joins.getFirst();
                                context.append(' ');
                                if (isUsingAliases()) {
                                        context.append(alias).append('.');
@@ -260,7 +259,7 @@ public abstract class EJBQLDbPathTranslator extends 
EJBQLBaseVisitor {
                } else {
                        DbRelationship lastRelationship = 
currentEntity.getRelationship(lastPathComponent);
 
-                       DbEntity targetEntity = null;
+                       DbEntity targetEntity;
                        if (lastRelationship != null) {
                                targetEntity = 
lastRelationship.getTargetEntity();
                        } else {
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/access/translator/ejbql/EJBQLTranslationContext.java
 
b/cayenne/src/main/java/org/apache/cayenne/access/translator/ejbql/EJBQLTranslationContext.java
index 493d0ccb2..22295d2d3 100644
--- 
a/cayenne/src/main/java/org/apache/cayenne/access/translator/ejbql/EJBQLTranslationContext.java
+++ 
b/cayenne/src/main/java/org/apache/cayenne/access/translator/ejbql/EJBQLTranslationContext.java
@@ -18,6 +18,7 @@
  ****************************************************************/
 package org.apache.cayenne.access.translator.ejbql;
 
+import org.apache.cayenne.dba.DbAdapter;
 import org.apache.cayenne.dba.QuotingStrategy;
 import org.apache.cayenne.ejbql.EJBQLCompiledExpression;
 import org.apache.cayenne.ejbql.EJBQLException;
@@ -49,7 +50,8 @@ public class EJBQLTranslationContext {
     private EJBQLCompiledExpression compiledExpression;
     protected Map<String, Object> namedParameters;
     protected Map<Integer, Object> positionalParameters;
-    private EJBQLTranslatorFactory translatorFactory;
+    private EJBQLTranslator translatorFactory;
+    private DbAdapter adapter;
     private QuotingStrategy quotingStrategy;
     private EntityResolver entityResolver;
     private List<Object> resultSetMetadata;
@@ -73,7 +75,7 @@ public class EJBQLTranslationContext {
 
     public EJBQLTranslationContext(EntityResolver entityResolver, EJBQLQuery 
query,
             EJBQLCompiledExpression compiledExpression,
-            EJBQLTranslatorFactory translatorFactory, QuotingStrategy 
quotingStrategy) {
+            EJBQLTranslator translatorFactory, DbAdapter adapter, 
QuotingStrategy quotingStrategy) {
 
         this.entityResolver = entityResolver;
         this.compiledExpression = compiledExpression;
@@ -82,6 +84,7 @@ public class EJBQLTranslationContext {
         this.namedParameters = query.getNamedParameters();
         this.positionalParameters = query.getPositionalParameters();
         this.translatorFactory = translatorFactory;
+        this.adapter = adapter;
         this.usingAliases = true;
         this.caseInsensitive = false;
         this.queryMetadata = query.getMetaData(entityResolver);
@@ -133,10 +136,17 @@ public class EJBQLTranslationContext {
         return id;
     }
 
-    EJBQLTranslatorFactory getTranslatorFactory() {
+    EJBQLTranslator getTranslatorFactory() {
         return translatorFactory;
     }
 
+    /**
+     * @since 5.0
+     */
+    DbAdapter getAdapter() {
+        return adapter;
+    }
+
     EntityResolver getEntityResolver() {
         return entityResolver;
     }
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/access/translator/ejbql/EJBQLTranslatorFactory.java
 
b/cayenne/src/main/java/org/apache/cayenne/access/translator/ejbql/EJBQLTranslator.java
similarity index 91%
rename from 
cayenne/src/main/java/org/apache/cayenne/access/translator/ejbql/EJBQLTranslatorFactory.java
rename to 
cayenne/src/main/java/org/apache/cayenne/access/translator/ejbql/EJBQLTranslator.java
index 15a14c064..ce8a02888 100644
--- 
a/cayenne/src/main/java/org/apache/cayenne/access/translator/ejbql/EJBQLTranslatorFactory.java
+++ 
b/cayenne/src/main/java/org/apache/cayenne/access/translator/ejbql/EJBQLTranslator.java
@@ -21,12 +21,12 @@ package org.apache.cayenne.access.translator.ejbql;
 import org.apache.cayenne.ejbql.EJBQLExpressionVisitor;
 
 /**
- * Defines a factory for translation visitors of EJBQL. DbAdapters can 
customize EJBQL
- * translation by providing their own factory implementation.
- * 
+ * A stateless service that produces translation visitors of EJBQL. DbAdapters 
can customize EJBQL
+ * translation by providing their own implementation.
+ *
  * @since 3.0
  */
-public interface EJBQLTranslatorFactory {
+public interface EJBQLTranslator {
     
     EJBQLJoinAppender getJoinAppender(EJBQLTranslationContext context);
 
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/access/translator/ejbql/JdbcEJBQLTranslatorFactory.java
 
b/cayenne/src/main/java/org/apache/cayenne/access/translator/ejbql/JdbcEJBQLTranslator.java
similarity index 96%
rename from 
cayenne/src/main/java/org/apache/cayenne/access/translator/ejbql/JdbcEJBQLTranslatorFactory.java
rename to 
cayenne/src/main/java/org/apache/cayenne/access/translator/ejbql/JdbcEJBQLTranslator.java
index 42c539506..cc6eecc0f 100644
--- 
a/cayenne/src/main/java/org/apache/cayenne/access/translator/ejbql/JdbcEJBQLTranslatorFactory.java
+++ 
b/cayenne/src/main/java/org/apache/cayenne/access/translator/ejbql/JdbcEJBQLTranslator.java
@@ -21,11 +21,11 @@ package org.apache.cayenne.access.translator.ejbql;
 import org.apache.cayenne.ejbql.EJBQLExpressionVisitor;
 
 /**
- * A default EJBQLTranslatorFactory.
- * 
+ * A default {@link EJBQLTranslator}.
+ *
  * @since 3.0
  */
-public class JdbcEJBQLTranslatorFactory implements EJBQLTranslatorFactory {
+public class JdbcEJBQLTranslator implements EJBQLTranslator {
 
     protected static final String JOIN_APPENDER_KEY = "$JoinAppender";
     
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/access/translator/procedure/ProcedureTranslator.java
 
b/cayenne/src/main/java/org/apache/cayenne/access/translator/procedure/ProcedureTranslator.java
index 9d7df9fd2..de8b32ba7 100644
--- 
a/cayenne/src/main/java/org/apache/cayenne/access/translator/procedure/ProcedureTranslator.java
+++ 
b/cayenne/src/main/java/org/apache/cayenne/access/translator/procedure/ProcedureTranslator.java
@@ -24,12 +24,12 @@ import org.apache.cayenne.map.EntityResolver;
 import org.apache.cayenne.query.ProcedureQuery;
 
 /**
- * A stateless service that translates a {@link ProcedureQuery} into an 
immutable {@link TranslatedProcedure}.
+ * A service that translates a {@link ProcedureQuery} into a {@link 
TranslatedProcedure}.
  */
 public interface ProcedureTranslator {
 
     /**
-     * Translates the provided query into an immutable {@link 
TranslatedProcedure}.
+     * Translates the provided query into a {@link TranslatedProcedure}.
      *
      * @since 5.0
      */
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/access/translator/select/SelectTranslator.java
 
b/cayenne/src/main/java/org/apache/cayenne/access/translator/select/SelectTranslator.java
index 30e444fd7..95638683a 100644
--- 
a/cayenne/src/main/java/org/apache/cayenne/access/translator/select/SelectTranslator.java
+++ 
b/cayenne/src/main/java/org/apache/cayenne/access/translator/select/SelectTranslator.java
@@ -24,14 +24,14 @@ import org.apache.cayenne.map.EntityResolver;
 import org.apache.cayenne.query.Select;
 
 /**
- * A stateless service that translates a {@link Select} query into an 
immutable {@link TranslatedSelect}.
+ * A service that translates a {@link Select} query into a {@link 
TranslatedSelect}.
  *
  * @since 4.0
  */
 public interface SelectTranslator {
 
     /**
-     * Translates the provided query into an immutable {@link 
TranslatedSelect}.
+     * Translates the provided query into a {@link TranslatedSelect}.
      *
      * @since 5.0
      */
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/configuration/runtime/CoreModule.java
 
b/cayenne/src/main/java/org/apache/cayenne/configuration/runtime/CoreModule.java
index d71c9d892..49427e36d 100644
--- 
a/cayenne/src/main/java/org/apache/cayenne/configuration/runtime/CoreModule.java
+++ 
b/cayenne/src/main/java/org/apache/cayenne/configuration/runtime/CoreModule.java
@@ -42,6 +42,8 @@ import 
org.apache.cayenne.access.translator.batch.BatchTranslator;
 import org.apache.cayenne.access.translator.batch.DeleteBatchTranslator;
 import org.apache.cayenne.access.translator.batch.InsertBatchTranslator;
 import org.apache.cayenne.access.translator.batch.UpdateBatchTranslator;
+import 
org.apache.cayenne.access.translator.ejbql.DbAdapterDelegatedEJBQLTranslator;
+import org.apache.cayenne.access.translator.ejbql.EJBQLTranslator;
 import 
org.apache.cayenne.access.translator.procedure.DbAdapterDelegatedProcedureTranslator;
 import org.apache.cayenne.access.translator.procedure.ProcedureTranslator;
 import 
org.apache.cayenne.access.translator.select.DbAdapterDelegatedSelectTranslator;
@@ -470,6 +472,7 @@ public class CoreModule implements Module {
         binder.bind(Key.get(BatchTranslator.class, 
BatchTranslator.DELETE)).to(DeleteBatchTranslator.class);
         
binder.bind(SelectTranslator.class).to(DbAdapterDelegatedSelectTranslator.class);
         
binder.bind(ProcedureTranslator.class).to(DbAdapterDelegatedProcedureTranslator.class);
+        
binder.bind(EJBQLTranslator.class).to(DbAdapterDelegatedEJBQLTranslator.class);
 
         // a default ObjectMapRetainStrategy used to create objects map for
         // ObjectStore
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/configuration/runtime/DefaultDataNodeFactory.java
 
b/cayenne/src/main/java/org/apache/cayenne/configuration/runtime/DefaultDataNodeFactory.java
index 23349873d..3ba714037 100644
--- 
a/cayenne/src/main/java/org/apache/cayenne/configuration/runtime/DefaultDataNodeFactory.java
+++ 
b/cayenne/src/main/java/org/apache/cayenne/configuration/runtime/DefaultDataNodeFactory.java
@@ -23,6 +23,7 @@ import 
org.apache.cayenne.access.dbsync.SchemaUpdateStrategyFactory;
 import org.apache.cayenne.access.translator.sqltemplate.SQLTemplateTranslator;
 import org.apache.cayenne.access.jdbc.reader.RowReaderFactory;
 import org.apache.cayenne.access.translator.batch.BatchTranslator;
+import org.apache.cayenne.access.translator.ejbql.EJBQLTranslator;
 import org.apache.cayenne.access.translator.procedure.ProcedureTranslator;
 import org.apache.cayenne.access.translator.select.SelectTranslator;
 import org.apache.cayenne.query.DeleteBatchQuery;
@@ -64,6 +65,9 @@ public class DefaultDataNodeFactory implements 
DataNodeFactory {
     @Inject
     protected ProcedureTranslator procedureTranslator;
 
+    @Inject
+    protected EJBQLTranslator ejbqlTranslator;
+
     @Inject
     protected DbAdapterFactory adapterFactory;
 
@@ -88,6 +92,7 @@ public class DefaultDataNodeFactory implements 
DataNodeFactory {
         dataNode.setDeleteBatchTranslator(deleteBatchTranslator);
         dataNode.setSelectTranslator(selectTranslator);
         dataNode.setProcedureTranslator(procedureTranslator);
+        dataNode.setEjbqlTranslator(ejbqlTranslator);
         dataNode.setSqlTemplateTranslator(sqlTemplateTranslator);
 
         DataSource dataSource = 
dataSourceFactory.getDataSource(nodeDescriptor);
diff --git a/cayenne/src/main/java/org/apache/cayenne/dba/AutoAdapter.java 
b/cayenne/src/main/java/org/apache/cayenne/dba/AutoAdapter.java
index 255512782..1f9f14e3b 100644
--- a/cayenne/src/main/java/org/apache/cayenne/dba/AutoAdapter.java
+++ b/cayenne/src/main/java/org/apache/cayenne/dba/AutoAdapter.java
@@ -23,7 +23,7 @@ import org.apache.cayenne.CayenneRuntimeException;
 import org.apache.cayenne.access.DataNode;
 import org.apache.cayenne.access.sqlbuilder.sqltree.SQLTreeProcessor;
 import org.apache.cayenne.access.translator.ParameterBinding;
-import org.apache.cayenne.access.translator.ejbql.EJBQLTranslatorFactory;
+import org.apache.cayenne.access.translator.ejbql.EJBQLTranslator;
 import org.apache.cayenne.access.translator.procedure.ProcedureTranslator;
 import org.apache.cayenne.access.translator.select.SelectTranslator;
 import org.apache.cayenne.access.types.ExtendedTypeMap;
@@ -268,11 +268,11 @@ public class AutoAdapter implements DbAdapter {
        }
 
        /**
-        * @since 4.0
+        * @since 5.0
         */
        @Override
-       public EJBQLTranslatorFactory getEjbqlTranslatorFactory() {
-               return getAdapter().getEjbqlTranslatorFactory();
+       public EJBQLTranslator getEjbqlTranslator() {
+               return getAdapter().getEjbqlTranslator();
        }
 
        @Override
diff --git a/cayenne/src/main/java/org/apache/cayenne/dba/DbAdapter.java 
b/cayenne/src/main/java/org/apache/cayenne/dba/DbAdapter.java
index ac54919fa..6590b4ce0 100644
--- a/cayenne/src/main/java/org/apache/cayenne/dba/DbAdapter.java
+++ b/cayenne/src/main/java/org/apache/cayenne/dba/DbAdapter.java
@@ -21,7 +21,7 @@ package org.apache.cayenne.dba;
 import org.apache.cayenne.access.DataNode;
 import org.apache.cayenne.access.sqlbuilder.sqltree.SQLTreeProcessor;
 import org.apache.cayenne.access.translator.ParameterBinding;
-import org.apache.cayenne.access.translator.ejbql.EJBQLTranslatorFactory;
+import org.apache.cayenne.access.translator.ejbql.EJBQLTranslator;
 import org.apache.cayenne.access.translator.procedure.ProcedureTranslator;
 import org.apache.cayenne.access.translator.select.SelectTranslator;
 import org.apache.cayenne.access.types.ExtendedTypeMap;
@@ -262,11 +262,19 @@ public interface DbAdapter {
        DbAdapter unwrap();
 
        /**
-        * Returns a translator factory for EJBQL to SQL translation.
+        * Returns the {@link EJBQLTranslator} for EJBQL to SQL translation.
         *
-        * @since 4.0
+        * @since 5.0
+        */
+       EJBQLTranslator getEjbqlTranslator();
+
+       /**
+        * @deprecated since 5.0 in favor of {@link #getEjbqlTranslator()}.
         */
-       EJBQLTranslatorFactory getEjbqlTranslatorFactory();
+       @Deprecated(since = "5.0")
+       default EJBQLTranslator getEjbqlTranslatorFactory() {
+               return getEjbqlTranslator();
+       }
 
        /**
         * @since 4.1
diff --git a/cayenne/src/main/java/org/apache/cayenne/dba/JdbcAdapter.java 
b/cayenne/src/main/java/org/apache/cayenne/dba/JdbcAdapter.java
index f23027b16..e60fc76fa 100644
--- a/cayenne/src/main/java/org/apache/cayenne/dba/JdbcAdapter.java
+++ b/cayenne/src/main/java/org/apache/cayenne/dba/JdbcAdapter.java
@@ -23,8 +23,8 @@ import org.apache.cayenne.CayenneRuntimeException;
 import org.apache.cayenne.access.DataNode;
 import org.apache.cayenne.access.sqlbuilder.sqltree.SQLTreeProcessor;
 import org.apache.cayenne.access.translator.ParameterBinding;
-import org.apache.cayenne.access.translator.ejbql.EJBQLTranslatorFactory;
-import org.apache.cayenne.access.translator.ejbql.JdbcEJBQLTranslatorFactory;
+import org.apache.cayenne.access.translator.ejbql.EJBQLTranslator;
+import org.apache.cayenne.access.translator.ejbql.JdbcEJBQLTranslator;
 import 
org.apache.cayenne.access.translator.procedure.DefaultProcedureTranslator;
 import org.apache.cayenne.access.translator.procedure.ProcedureTranslator;
 import org.apache.cayenne.access.translator.select.DefaultSelectTranslator;
@@ -74,7 +74,7 @@ public class JdbcAdapter implements DbAdapter {
     protected boolean supportsBatchUpdates;
     protected boolean supportsUniqueConstraints;
     protected boolean supportsGeneratedKeys;
-    protected EJBQLTranslatorFactory ejbqlTranslatorFactory;
+    protected EJBQLTranslator ejbqlTranslator;
 
     protected ResourceLocator resourceLocator;
     protected boolean caseInsensitiveCollations;
@@ -100,7 +100,7 @@ public class JdbcAdapter implements DbAdapter {
 
         this.quotingStrategy = createQuotingStrategy();
 
-        this.ejbqlTranslatorFactory = createEJBQLTranslatorFactory();
+        this.ejbqlTranslator = createEJBQLTranslator();
         this.typesHandler = 
TypesHandler.getHandler(findResource("/types.xml"));
         this.extendedTypes = new ExtendedTypeMap();
         initExtendedTypes(defaultExtendedTypes, userExtendedTypes, 
extendedTypeFactories, valueObjectTypeRegistry);
@@ -186,14 +186,14 @@ public class JdbcAdapter implements DbAdapter {
     }
 
     /**
-     * Creates and returns an {@link EJBQLTranslatorFactory} used to generate
+     * Creates and returns an {@link EJBQLTranslator} used to generate
      * visitors for EJBQL to SQL translations. This method should be overriden
      * by subclasses that need to customize EJBQL generation.
      *
      * @since 3.0
      */
-    protected EJBQLTranslatorFactory createEJBQLTranslatorFactory() {
-        JdbcEJBQLTranslatorFactory translatorFactory = new 
JdbcEJBQLTranslatorFactory();
+    protected EJBQLTranslator createEJBQLTranslator() {
+        JdbcEJBQLTranslator translatorFactory = new JdbcEJBQLTranslator();
         translatorFactory.setCaseInsensitive(caseInsensitiveCollations);
         return translatorFactory;
     }
@@ -579,15 +579,15 @@ public class JdbcAdapter implements DbAdapter {
     }
 
     /**
-     * Returns a translator factory for EJBQL to SQL translation. The factory 
is
-     * normally initialized in constructor by calling
-     * {@link #createEJBQLTranslatorFactory()}, and can be changed later by
-     * calling {@link #setEjbqlTranslatorFactory(EJBQLTranslatorFactory)}.
+     * Returns the {@link EJBQLTranslator} for EJBQL to SQL translation. It is 
normally initialized in the
+     * constructor by calling {@link #createEJBQLTranslator()}, and can be 
changed later by calling
+     * {@link #setEjbqlTranslator(EJBQLTranslator)}.
      *
-     * @since 3.0
+     * @since 5.0
      */
-    public EJBQLTranslatorFactory getEjbqlTranslatorFactory() {
-        return ejbqlTranslatorFactory;
+    @Override
+    public EJBQLTranslator getEjbqlTranslator() {
+        return ejbqlTranslator;
     }
 
     @Override
@@ -601,15 +601,22 @@ public class JdbcAdapter implements DbAdapter {
     }
 
     /**
-     * Sets a translator factory for EJBQL to SQL translation. This property is
-     * normally initialized in constructor by calling
-     * {@link #createEJBQLTranslatorFactory()}, so users would only override it
-     * if they need to customize EJBQL translation.
+     * Sets the {@link EJBQLTranslator} for EJBQL to SQL translation. This 
property is normally initialized in the
+     * constructor by calling {@link #createEJBQLTranslator()}, so users would 
only override it if they need to
+     * customize EJBQL translation.
      *
-     * @since 3.0
+     * @since 5.0
+     */
+    public void setEjbqlTranslator(EJBQLTranslator ejbqlTranslator) {
+        this.ejbqlTranslator = ejbqlTranslator;
+    }
+
+    /**
+     * @deprecated since 5.0 in favor of {@link 
#setEjbqlTranslator(EJBQLTranslator)}.
      */
-    public void setEjbqlTranslatorFactory(EJBQLTranslatorFactory 
ejbqlTranslatorFactory) {
-        this.ejbqlTranslatorFactory = ejbqlTranslatorFactory;
+    @Deprecated(since = "5.0")
+    public void setEjbqlTranslatorFactory(EJBQLTranslator ejbqlTranslator) {
+        setEjbqlTranslator(ejbqlTranslator);
     }
 
     /**
diff --git a/cayenne/src/main/java/org/apache/cayenne/dba/db2/DB2Adapter.java 
b/cayenne/src/main/java/org/apache/cayenne/dba/db2/DB2Adapter.java
index 801e7e35b..21f5a793d 100644
--- a/cayenne/src/main/java/org/apache/cayenne/dba/db2/DB2Adapter.java
+++ b/cayenne/src/main/java/org/apache/cayenne/dba/db2/DB2Adapter.java
@@ -27,8 +27,8 @@ import org.apache.cayenne.CayenneRuntimeException;
 import org.apache.cayenne.access.DataNode;
 import org.apache.cayenne.access.sqlbuilder.sqltree.SQLTreeProcessor;
 import org.apache.cayenne.access.translator.ParameterBinding;
-import org.apache.cayenne.access.translator.ejbql.EJBQLTranslatorFactory;
-import org.apache.cayenne.access.translator.ejbql.JdbcEJBQLTranslatorFactory;
+import org.apache.cayenne.access.translator.ejbql.EJBQLTranslator;
+import org.apache.cayenne.access.translator.ejbql.JdbcEJBQLTranslator;
 import org.apache.cayenne.access.types.BooleanType;
 import org.apache.cayenne.access.types.ByteArrayType;
 import org.apache.cayenne.access.types.CharType;
@@ -150,13 +150,13 @@ public class DB2Adapter extends JdbcAdapter {
     }
 
     /**
-     * @since 4.0
+     * @since 5.0
      */
     @Override
-    public EJBQLTranslatorFactory getEjbqlTranslatorFactory() {
-        JdbcEJBQLTranslatorFactory translatorFactory = new 
DB2EJBQLTranslatorFactory();
-        translatorFactory.setCaseInsensitive(caseInsensitiveCollations);
-        return translatorFactory;
+    public EJBQLTranslator getEjbqlTranslator() {
+        JdbcEJBQLTranslator translator = new DB2EJBQLTranslator();
+        translator.setCaseInsensitive(caseInsensitiveCollations);
+        return translator;
     }
 
     @Override
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/dba/db2/DB2EJBQLTranslatorFactory.java
 b/cayenne/src/main/java/org/apache/cayenne/dba/db2/DB2EJBQLTranslator.java
similarity index 94%
rename from 
cayenne/src/main/java/org/apache/cayenne/dba/db2/DB2EJBQLTranslatorFactory.java
rename to 
cayenne/src/main/java/org/apache/cayenne/dba/db2/DB2EJBQLTranslator.java
index d57b291d1..9b0b6606e 100644
--- 
a/cayenne/src/main/java/org/apache/cayenne/dba/db2/DB2EJBQLTranslatorFactory.java
+++ b/cayenne/src/main/java/org/apache/cayenne/dba/db2/DB2EJBQLTranslator.java
@@ -20,13 +20,13 @@
 package org.apache.cayenne.dba.db2;
 
 import org.apache.cayenne.access.translator.ejbql.EJBQLTranslationContext;
-import org.apache.cayenne.access.translator.ejbql.JdbcEJBQLTranslatorFactory;
+import org.apache.cayenne.access.translator.ejbql.JdbcEJBQLTranslator;
 import org.apache.cayenne.ejbql.EJBQLExpressionVisitor;
 
 /**
  * @since 4.0
  */
-public class DB2EJBQLTranslatorFactory extends JdbcEJBQLTranslatorFactory {
+public class DB2EJBQLTranslator extends JdbcEJBQLTranslator {
 
     @Override
     public EJBQLExpressionVisitor 
getConditionTranslator(EJBQLTranslationContext context) {
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/dba/derby/DerbyAdapter.java 
b/cayenne/src/main/java/org/apache/cayenne/dba/derby/DerbyAdapter.java
index a9007e37b..954c90476 100644
--- a/cayenne/src/main/java/org/apache/cayenne/dba/derby/DerbyAdapter.java
+++ b/cayenne/src/main/java/org/apache/cayenne/dba/derby/DerbyAdapter.java
@@ -23,8 +23,8 @@ import org.apache.cayenne.CayenneRuntimeException;
 import org.apache.cayenne.access.DataNode;
 import org.apache.cayenne.access.sqlbuilder.sqltree.SQLTreeProcessor;
 import org.apache.cayenne.access.translator.ParameterBinding;
-import org.apache.cayenne.access.translator.ejbql.EJBQLTranslatorFactory;
-import org.apache.cayenne.access.translator.ejbql.JdbcEJBQLTranslatorFactory;
+import org.apache.cayenne.access.translator.ejbql.EJBQLTranslator;
+import org.apache.cayenne.access.translator.ejbql.JdbcEJBQLTranslator;
 import org.apache.cayenne.access.types.ByteType;
 import org.apache.cayenne.access.types.CharType;
 import org.apache.cayenne.access.types.ExtendedType;
@@ -185,8 +185,8 @@ public class DerbyAdapter extends JdbcAdapter {
      * @since 3.1
      */
     @Override
-    protected EJBQLTranslatorFactory createEJBQLTranslatorFactory() {
-        JdbcEJBQLTranslatorFactory translatorFactory = new 
DerbyEJBQLTranslatorFactory();
+    protected EJBQLTranslator createEJBQLTranslator() {
+        JdbcEJBQLTranslator translatorFactory = new DerbyEJBQLTranslator();
         translatorFactory.setCaseInsensitive(caseInsensitiveCollations);
         return translatorFactory;
     }
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/dba/derby/DerbyEJBQLTranslatorFactory.java
 b/cayenne/src/main/java/org/apache/cayenne/dba/derby/DerbyEJBQLTranslator.java
similarity index 93%
rename from 
cayenne/src/main/java/org/apache/cayenne/dba/derby/DerbyEJBQLTranslatorFactory.java
rename to 
cayenne/src/main/java/org/apache/cayenne/dba/derby/DerbyEJBQLTranslator.java
index e0d89c4e3..31d6be619 100644
--- 
a/cayenne/src/main/java/org/apache/cayenne/dba/derby/DerbyEJBQLTranslatorFactory.java
+++ 
b/cayenne/src/main/java/org/apache/cayenne/dba/derby/DerbyEJBQLTranslator.java
@@ -19,13 +19,13 @@
 package org.apache.cayenne.dba.derby;
 
 import org.apache.cayenne.access.translator.ejbql.EJBQLTranslationContext;
-import org.apache.cayenne.access.translator.ejbql.JdbcEJBQLTranslatorFactory;
+import org.apache.cayenne.access.translator.ejbql.JdbcEJBQLTranslator;
 import org.apache.cayenne.ejbql.EJBQLExpressionVisitor;
 
 /**
  * @since 3.1
  */
-public class DerbyEJBQLTranslatorFactory extends JdbcEJBQLTranslatorFactory {
+public class DerbyEJBQLTranslator extends JdbcEJBQLTranslator {
 
     @Override
     public EJBQLExpressionVisitor 
getConditionTranslator(EJBQLTranslationContext context) {
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/dba/firebird/FirebirdAdapter.java 
b/cayenne/src/main/java/org/apache/cayenne/dba/firebird/FirebirdAdapter.java
index 065a03a62..1c804391a 100644
--- a/cayenne/src/main/java/org/apache/cayenne/dba/firebird/FirebirdAdapter.java
+++ b/cayenne/src/main/java/org/apache/cayenne/dba/firebird/FirebirdAdapter.java
@@ -22,7 +22,7 @@ package org.apache.cayenne.dba.firebird;
 import org.apache.cayenne.CayenneRuntimeException;
 import org.apache.cayenne.access.DataNode;
 import org.apache.cayenne.access.sqlbuilder.sqltree.SQLTreeProcessor;
-import org.apache.cayenne.access.translator.ejbql.EJBQLTranslatorFactory;
+import org.apache.cayenne.access.translator.ejbql.EJBQLTranslator;
 import org.apache.cayenne.access.types.ByteArrayType;
 import org.apache.cayenne.access.types.CharType;
 import org.apache.cayenne.access.types.ExtendedType;
@@ -108,9 +108,12 @@ public class FirebirdAdapter extends JdbcAdapter {
         return new FirebirdSQLTreeProcessor();
     }
 
+    /**
+     * @since 5.0
+     */
     @Override
-    public EJBQLTranslatorFactory getEjbqlTranslatorFactory() {
-        return new FirebirdEJBQLTranslatorFactory();
+    public EJBQLTranslator getEjbqlTranslator() {
+        return new FirebirdEJBQLTranslator();
     }
 
     @Override
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/dba/firebird/FirebirdEJBQLTranslatorFactory.java
 
b/cayenne/src/main/java/org/apache/cayenne/dba/firebird/FirebirdEJBQLTranslator.java
similarity index 93%
rename from 
cayenne/src/main/java/org/apache/cayenne/dba/firebird/FirebirdEJBQLTranslatorFactory.java
rename to 
cayenne/src/main/java/org/apache/cayenne/dba/firebird/FirebirdEJBQLTranslator.java
index 3c4b6ccf0..d3afd2e30 100644
--- 
a/cayenne/src/main/java/org/apache/cayenne/dba/firebird/FirebirdEJBQLTranslatorFactory.java
+++ 
b/cayenne/src/main/java/org/apache/cayenne/dba/firebird/FirebirdEJBQLTranslator.java
@@ -20,13 +20,13 @@
 package org.apache.cayenne.dba.firebird;
 
 import org.apache.cayenne.access.translator.ejbql.EJBQLTranslationContext;
-import org.apache.cayenne.access.translator.ejbql.JdbcEJBQLTranslatorFactory;
+import org.apache.cayenne.access.translator.ejbql.JdbcEJBQLTranslator;
 import org.apache.cayenne.ejbql.EJBQLExpressionVisitor;
 
 /**
  * @since 4.0
  */
-public class FirebirdEJBQLTranslatorFactory extends JdbcEJBQLTranslatorFactory 
{
+public class FirebirdEJBQLTranslator extends JdbcEJBQLTranslator {
 
     @Override
     public EJBQLExpressionVisitor 
getConditionTranslator(EJBQLTranslationContext context) {
diff --git a/cayenne/src/main/java/org/apache/cayenne/dba/h2/H2Adapter.java 
b/cayenne/src/main/java/org/apache/cayenne/dba/h2/H2Adapter.java
index 013a52dd5..0a2383cba 100644
--- a/cayenne/src/main/java/org/apache/cayenne/dba/h2/H2Adapter.java
+++ b/cayenne/src/main/java/org/apache/cayenne/dba/h2/H2Adapter.java
@@ -21,8 +21,8 @@ package org.apache.cayenne.dba.h2;
 
 import org.apache.cayenne.access.DataNode;
 import org.apache.cayenne.access.sqlbuilder.sqltree.SQLTreeProcessor;
-import org.apache.cayenne.access.translator.ejbql.EJBQLTranslatorFactory;
-import org.apache.cayenne.access.translator.ejbql.JdbcEJBQLTranslatorFactory;
+import org.apache.cayenne.access.translator.ejbql.EJBQLTranslator;
+import org.apache.cayenne.access.translator.ejbql.JdbcEJBQLTranslator;
 import org.apache.cayenne.access.types.ExtendedType;
 import org.apache.cayenne.access.types.ExtendedTypeFactory;
 import org.apache.cayenne.access.types.ExtendedTypeMap;
@@ -87,8 +87,8 @@ public class H2Adapter extends JdbcAdapter {
      * @since 5.0
      */
     @Override
-    protected EJBQLTranslatorFactory createEJBQLTranslatorFactory() {
-        JdbcEJBQLTranslatorFactory translatorFactory = new 
H2EJBQLTranslatorFactory();
+    protected EJBQLTranslator createEJBQLTranslator() {
+        JdbcEJBQLTranslator translatorFactory = new H2EJBQLTranslator();
         translatorFactory.setCaseInsensitive(caseInsensitiveCollations);
         return translatorFactory;
     }
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/dba/h2/H2EJBQLTranslatorFactory.java 
b/cayenne/src/main/java/org/apache/cayenne/dba/h2/H2EJBQLTranslator.java
similarity index 93%
rename from 
cayenne/src/main/java/org/apache/cayenne/dba/h2/H2EJBQLTranslatorFactory.java
rename to cayenne/src/main/java/org/apache/cayenne/dba/h2/H2EJBQLTranslator.java
index 8497515d8..21d63eac2 100644
--- 
a/cayenne/src/main/java/org/apache/cayenne/dba/h2/H2EJBQLTranslatorFactory.java
+++ b/cayenne/src/main/java/org/apache/cayenne/dba/h2/H2EJBQLTranslator.java
@@ -20,13 +20,13 @@
 package org.apache.cayenne.dba.h2;
 
 import org.apache.cayenne.access.translator.ejbql.EJBQLTranslationContext;
-import org.apache.cayenne.access.translator.ejbql.JdbcEJBQLTranslatorFactory;
+import org.apache.cayenne.access.translator.ejbql.JdbcEJBQLTranslator;
 import org.apache.cayenne.ejbql.EJBQLExpressionVisitor;
 
 /**
  * @since 5.0
  */
-public class H2EJBQLTranslatorFactory extends JdbcEJBQLTranslatorFactory {
+public class H2EJBQLTranslator extends JdbcEJBQLTranslator {
 
     @Override
     public EJBQLExpressionVisitor 
getConditionTranslator(EJBQLTranslationContext context) {
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/dba/hsqldb/HSQLDBAdapter.java 
b/cayenne/src/main/java/org/apache/cayenne/dba/hsqldb/HSQLDBAdapter.java
index 2ab9b619f..8178768a7 100644
--- a/cayenne/src/main/java/org/apache/cayenne/dba/hsqldb/HSQLDBAdapter.java
+++ b/cayenne/src/main/java/org/apache/cayenne/dba/hsqldb/HSQLDBAdapter.java
@@ -22,8 +22,8 @@ package org.apache.cayenne.dba.hsqldb;
 import org.apache.cayenne.CayenneRuntimeException;
 import org.apache.cayenne.access.DataNode;
 import org.apache.cayenne.access.sqlbuilder.sqltree.SQLTreeProcessor;
-import org.apache.cayenne.access.translator.ejbql.EJBQLTranslatorFactory;
-import org.apache.cayenne.access.translator.ejbql.JdbcEJBQLTranslatorFactory;
+import org.apache.cayenne.access.translator.ejbql.EJBQLTranslator;
+import org.apache.cayenne.access.translator.ejbql.JdbcEJBQLTranslator;
 import org.apache.cayenne.access.translator.procedure.ProcedureTranslator;
 import org.apache.cayenne.access.types.CharType;
 import org.apache.cayenne.access.types.ExtendedType;
@@ -110,8 +110,8 @@ public class HSQLDBAdapter extends JdbcAdapter {
         * @since 4.0
         */
        @Override
-       protected EJBQLTranslatorFactory createEJBQLTranslatorFactory() {
-               JdbcEJBQLTranslatorFactory translatorFactory = new 
HSQLEJBQLTranslatorFactory();
+       protected EJBQLTranslator createEJBQLTranslator() {
+               JdbcEJBQLTranslator translatorFactory = new 
HSQLEJBQLTranslator();
                translatorFactory.setCaseInsensitive(caseInsensitiveCollations);
                return translatorFactory;
        }
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/dba/hsqldb/HSQLEJBQLTranslatorFactory.java
 b/cayenne/src/main/java/org/apache/cayenne/dba/hsqldb/HSQLEJBQLTranslator.java
similarity index 93%
rename from 
cayenne/src/main/java/org/apache/cayenne/dba/hsqldb/HSQLEJBQLTranslatorFactory.java
rename to 
cayenne/src/main/java/org/apache/cayenne/dba/hsqldb/HSQLEJBQLTranslator.java
index 9a0a2695f..b7ba23cde 100644
--- 
a/cayenne/src/main/java/org/apache/cayenne/dba/hsqldb/HSQLEJBQLTranslatorFactory.java
+++ 
b/cayenne/src/main/java/org/apache/cayenne/dba/hsqldb/HSQLEJBQLTranslator.java
@@ -20,13 +20,13 @@
 package org.apache.cayenne.dba.hsqldb;
 
 import org.apache.cayenne.access.translator.ejbql.EJBQLTranslationContext;
-import org.apache.cayenne.access.translator.ejbql.JdbcEJBQLTranslatorFactory;
+import org.apache.cayenne.access.translator.ejbql.JdbcEJBQLTranslator;
 import org.apache.cayenne.ejbql.EJBQLExpressionVisitor;
 
 /**
  * @since 4.0
  */
-public class HSQLEJBQLTranslatorFactory extends JdbcEJBQLTranslatorFactory {
+public class HSQLEJBQLTranslator extends JdbcEJBQLTranslator {
 
     @Override
     public EJBQLExpressionVisitor 
getConditionTranslator(EJBQLTranslationContext context) {
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/dba/mysql/MySQLAdapter.java 
b/cayenne/src/main/java/org/apache/cayenne/dba/mysql/MySQLAdapter.java
index 14c537586..190726e79 100644
--- a/cayenne/src/main/java/org/apache/cayenne/dba/mysql/MySQLAdapter.java
+++ b/cayenne/src/main/java/org/apache/cayenne/dba/mysql/MySQLAdapter.java
@@ -23,8 +23,8 @@ import org.apache.cayenne.access.DataNode;
 import org.apache.cayenne.access.sqlbuilder.sqltree.SQLTreeProcessor;
 import org.apache.cayenne.access.translator.ParameterBinding;
 import org.apache.cayenne.access.translator.procedure.ProcedureTranslator;
-import org.apache.cayenne.access.translator.ejbql.EJBQLTranslatorFactory;
-import org.apache.cayenne.access.translator.ejbql.JdbcEJBQLTranslatorFactory;
+import org.apache.cayenne.access.translator.ejbql.EJBQLTranslator;
+import org.apache.cayenne.access.translator.ejbql.JdbcEJBQLTranslator;
 import org.apache.cayenne.access.types.ByteArrayType;
 import org.apache.cayenne.access.types.CharType;
 import org.apache.cayenne.access.types.DateType;
@@ -252,8 +252,8 @@ public class MySQLAdapter extends JdbcAdapter {
         * @since 3.0
         */
        @Override
-       protected EJBQLTranslatorFactory createEJBQLTranslatorFactory() {
-               JdbcEJBQLTranslatorFactory translatorFactory = new 
MySQLEJBQLTranslatorFactory();
+       protected EJBQLTranslator createEJBQLTranslator() {
+               JdbcEJBQLTranslator translatorFactory = new 
MySQLEJBQLTranslator();
                translatorFactory.setCaseInsensitive(caseInsensitiveCollations);
                return translatorFactory;
        }
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/dba/mysql/MySQLEJBQLTranslatorFactory.java
 b/cayenne/src/main/java/org/apache/cayenne/dba/mysql/MySQLEJBQLTranslator.java
similarity index 94%
rename from 
cayenne/src/main/java/org/apache/cayenne/dba/mysql/MySQLEJBQLTranslatorFactory.java
rename to 
cayenne/src/main/java/org/apache/cayenne/dba/mysql/MySQLEJBQLTranslator.java
index add3fe126..053f387f2 100644
--- 
a/cayenne/src/main/java/org/apache/cayenne/dba/mysql/MySQLEJBQLTranslatorFactory.java
+++ 
b/cayenne/src/main/java/org/apache/cayenne/dba/mysql/MySQLEJBQLTranslator.java
@@ -19,13 +19,13 @@
 package org.apache.cayenne.dba.mysql;
 
 import org.apache.cayenne.access.translator.ejbql.EJBQLTranslationContext;
-import org.apache.cayenne.access.translator.ejbql.JdbcEJBQLTranslatorFactory;
+import org.apache.cayenne.access.translator.ejbql.JdbcEJBQLTranslator;
 import org.apache.cayenne.ejbql.EJBQLExpressionVisitor;
 
 /**
  * @since 3.0
  */
-class MySQLEJBQLTranslatorFactory extends JdbcEJBQLTranslatorFactory {
+class MySQLEJBQLTranslator extends JdbcEJBQLTranslator {
 
     @Override
     public EJBQLExpressionVisitor 
getConditionTranslator(EJBQLTranslationContext context) {
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/dba/oracle/OracleAdapter.java 
b/cayenne/src/main/java/org/apache/cayenne/dba/oracle/OracleAdapter.java
index aa7673555..d457f7da7 100644
--- a/cayenne/src/main/java/org/apache/cayenne/dba/oracle/OracleAdapter.java
+++ b/cayenne/src/main/java/org/apache/cayenne/dba/oracle/OracleAdapter.java
@@ -23,7 +23,7 @@ import org.apache.cayenne.CayenneRuntimeException;
 import org.apache.cayenne.access.DataNode;
 import org.apache.cayenne.access.sqlbuilder.sqltree.SQLTreeProcessor;
 import org.apache.cayenne.access.translator.ParameterBinding;
-import org.apache.cayenne.access.translator.ejbql.EJBQLTranslatorFactory;
+import org.apache.cayenne.access.translator.ejbql.EJBQLTranslator;
 import org.apache.cayenne.access.types.ByteType;
 import org.apache.cayenne.access.types.ExtendedType;
 import org.apache.cayenne.access.types.ExtendedTypeFactory;
@@ -185,8 +185,8 @@ public class OracleAdapter extends JdbcAdapter {
         * @since 3.0
         */
        @Override
-       protected EJBQLTranslatorFactory createEJBQLTranslatorFactory() {
-               return new OracleEJBQLTranslatorFactory();
+       protected EJBQLTranslator createEJBQLTranslator() {
+               return new OracleEJBQLTranslator();
        }
 
        /**
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/dba/oracle/OracleEJBQLTranslatorFactory.java
 
b/cayenne/src/main/java/org/apache/cayenne/dba/oracle/OracleEJBQLTranslator.java
similarity index 94%
rename from 
cayenne/src/main/java/org/apache/cayenne/dba/oracle/OracleEJBQLTranslatorFactory.java
rename to 
cayenne/src/main/java/org/apache/cayenne/dba/oracle/OracleEJBQLTranslator.java
index b4d7c3e6d..1456d79e0 100644
--- 
a/cayenne/src/main/java/org/apache/cayenne/dba/oracle/OracleEJBQLTranslatorFactory.java
+++ 
b/cayenne/src/main/java/org/apache/cayenne/dba/oracle/OracleEJBQLTranslator.java
@@ -19,13 +19,13 @@
 package org.apache.cayenne.dba.oracle;
 
 import org.apache.cayenne.access.translator.ejbql.EJBQLTranslationContext;
-import org.apache.cayenne.access.translator.ejbql.JdbcEJBQLTranslatorFactory;
+import org.apache.cayenne.access.translator.ejbql.JdbcEJBQLTranslator;
 import org.apache.cayenne.ejbql.EJBQLExpressionVisitor;
 
 /**
  * @since 3.0
  */
-class OracleEJBQLTranslatorFactory extends JdbcEJBQLTranslatorFactory {
+class OracleEJBQLTranslator extends JdbcEJBQLTranslator {
 
     @Override
     public EJBQLExpressionVisitor 
getConditionTranslator(EJBQLTranslationContext context) {
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/dba/sqlserver/SQLServerAdapter.java 
b/cayenne/src/main/java/org/apache/cayenne/dba/sqlserver/SQLServerAdapter.java
index 9873b183d..f4af22cdf 100644
--- 
a/cayenne/src/main/java/org/apache/cayenne/dba/sqlserver/SQLServerAdapter.java
+++ 
b/cayenne/src/main/java/org/apache/cayenne/dba/sqlserver/SQLServerAdapter.java
@@ -23,7 +23,7 @@ import org.apache.cayenne.CayenneRuntimeException;
 import org.apache.cayenne.access.DataNode;
 import org.apache.cayenne.access.sqlbuilder.sqltree.SQLTreeProcessor;
 import org.apache.cayenne.access.translator.ParameterBinding;
-import org.apache.cayenne.access.translator.ejbql.EJBQLTranslatorFactory;
+import org.apache.cayenne.access.translator.ejbql.EJBQLTranslator;
 import org.apache.cayenne.access.types.ByteArrayType;
 import org.apache.cayenne.access.types.ByteType;
 import org.apache.cayenne.access.types.CharType;
@@ -122,8 +122,8 @@ public class SQLServerAdapter extends JdbcAdapter {
     }
 
     @Override
-    protected EJBQLTranslatorFactory createEJBQLTranslatorFactory() {
-        return new SQLServerEJBQLTranslatorFactory();
+    protected EJBQLTranslator createEJBQLTranslator() {
+        return new SQLServerEJBQLTranslator();
     }
 
     /**
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/dba/sqlserver/SQLServerEJBQLTranslatorFactory.java
 
b/cayenne/src/main/java/org/apache/cayenne/dba/sqlserver/SQLServerEJBQLTranslator.java
similarity index 93%
rename from 
cayenne/src/main/java/org/apache/cayenne/dba/sqlserver/SQLServerEJBQLTranslatorFactory.java
rename to 
cayenne/src/main/java/org/apache/cayenne/dba/sqlserver/SQLServerEJBQLTranslator.java
index b56112a7e..d2f5c654b 100644
--- 
a/cayenne/src/main/java/org/apache/cayenne/dba/sqlserver/SQLServerEJBQLTranslatorFactory.java
+++ 
b/cayenne/src/main/java/org/apache/cayenne/dba/sqlserver/SQLServerEJBQLTranslator.java
@@ -19,10 +19,10 @@
 package org.apache.cayenne.dba.sqlserver;
 
 import org.apache.cayenne.access.translator.ejbql.EJBQLTranslationContext;
-import org.apache.cayenne.access.translator.ejbql.JdbcEJBQLTranslatorFactory;
+import org.apache.cayenne.access.translator.ejbql.JdbcEJBQLTranslator;
 import org.apache.cayenne.ejbql.EJBQLExpressionVisitor;
 
-class SQLServerEJBQLTranslatorFactory extends JdbcEJBQLTranslatorFactory {
+class SQLServerEJBQLTranslator extends JdbcEJBQLTranslator {
 
     @Override
     public EJBQLExpressionVisitor 
getConditionTranslator(EJBQLTranslationContext context) {
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/dba/sybase/SybaseAdapter.java 
b/cayenne/src/main/java/org/apache/cayenne/dba/sybase/SybaseAdapter.java
index 9ddff72a7..59eb79823 100644
--- a/cayenne/src/main/java/org/apache/cayenne/dba/sybase/SybaseAdapter.java
+++ b/cayenne/src/main/java/org/apache/cayenne/dba/sybase/SybaseAdapter.java
@@ -21,7 +21,7 @@ package org.apache.cayenne.dba.sybase;
 
 import org.apache.cayenne.access.sqlbuilder.sqltree.SQLTreeProcessor;
 import org.apache.cayenne.access.translator.ParameterBinding;
-import org.apache.cayenne.access.translator.ejbql.EJBQLTranslatorFactory;
+import org.apache.cayenne.access.translator.ejbql.EJBQLTranslator;
 import org.apache.cayenne.access.types.ByteArrayType;
 import org.apache.cayenne.access.types.ByteType;
 import org.apache.cayenne.access.types.CharType;
@@ -68,8 +68,8 @@ public class SybaseAdapter extends JdbcAdapter {
      * @since 3.0
      */
     @Override
-    protected EJBQLTranslatorFactory createEJBQLTranslatorFactory() {
-        return new SybaseEJBQLTranslatorFactory();
+    protected EJBQLTranslator createEJBQLTranslator() {
+        return new SybaseEJBQLTranslator();
     }
 
     /**
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/dba/sybase/SybaseEJBQLTranslatorFactory.java
 
b/cayenne/src/main/java/org/apache/cayenne/dba/sybase/SybaseEJBQLTranslator.java
similarity index 94%
rename from 
cayenne/src/main/java/org/apache/cayenne/dba/sybase/SybaseEJBQLTranslatorFactory.java
rename to 
cayenne/src/main/java/org/apache/cayenne/dba/sybase/SybaseEJBQLTranslator.java
index 3a60c62ff..10fb8907f 100644
--- 
a/cayenne/src/main/java/org/apache/cayenne/dba/sybase/SybaseEJBQLTranslatorFactory.java
+++ 
b/cayenne/src/main/java/org/apache/cayenne/dba/sybase/SybaseEJBQLTranslator.java
@@ -19,10 +19,10 @@
 package org.apache.cayenne.dba.sybase;
 
 import org.apache.cayenne.access.translator.ejbql.EJBQLTranslationContext;
-import org.apache.cayenne.access.translator.ejbql.JdbcEJBQLTranslatorFactory;
+import org.apache.cayenne.access.translator.ejbql.JdbcEJBQLTranslator;
 import org.apache.cayenne.ejbql.EJBQLExpressionVisitor;
 
-class SybaseEJBQLTranslatorFactory extends JdbcEJBQLTranslatorFactory {
+class SybaseEJBQLTranslator extends JdbcEJBQLTranslator {
 
     @Override
     public EJBQLExpressionVisitor 
getConditionTranslator(EJBQLTranslationContext context) {
diff --git 
a/cayenne/src/test/java/org/apache/cayenne/access/translator/ejbql/EJBQLSelectTranslatorIT.java
 
b/cayenne/src/test/java/org/apache/cayenne/access/translator/ejbql/EJBQLSelectTranslatorIT.java
index fa3a7237e..3cc2fec2c 100644
--- 
a/cayenne/src/test/java/org/apache/cayenne/access/translator/ejbql/EJBQLSelectTranslatorIT.java
+++ 
b/cayenne/src/test/java/org/apache/cayenne/access/translator/ejbql/EJBQLSelectTranslatorIT.java
@@ -56,7 +56,7 @@ public class EJBQLSelectTranslatorIT {
         };
 
         EJBQLTranslationContext tr = new 
EJBQLTranslationContext(env.runtime().getDataDomain().getEntityResolver(), 
query,
-                select, new JdbcEJBQLTranslatorFactory(), 
env.dataNode().getAdapter().getQuotingStrategy());
+                select, new JdbcEJBQLTranslator(), 
env.dataNode().getAdapter(), env.dataNode().getAdapter().getQuotingStrategy());
         select.getExpression().visit(new EJBQLSelectTranslator(tr));
         return tr.getQuery();
     }
@@ -308,7 +308,7 @@ public class EJBQLSelectTranslatorIT {
         query.setParameter("x", null);
 
         EJBQLTranslationContext tr = new 
EJBQLTranslationContext(env.runtime().getDataDomain().getEntityResolver(), 
query,
-                select, new JdbcEJBQLTranslatorFactory(), 
env.dataNode().getAdapter().getQuotingStrategy());
+                select, new JdbcEJBQLTranslator(), 
env.dataNode().getAdapter(), env.dataNode().getAdapter().getQuotingStrategy());
         select.getExpression().visit(new EJBQLSelectTranslator(tr));
         String sql = tr.getQuery().getDefaultTemplate();
         assertTrue(sql.endsWith("t0.ARTIST_ID IS NULL"), sql);
@@ -325,7 +325,7 @@ public class EJBQLSelectTranslatorIT {
         query.setParameter("b", "Y");
 
         EJBQLTranslationContext tr = new 
EJBQLTranslationContext(env.runtime().getDataDomain().getEntityResolver(), 
query,
-                select, new JdbcEJBQLTranslatorFactory(), 
env.dataNode().getAdapter().getQuotingStrategy());
+                select, new JdbcEJBQLTranslator(), 
env.dataNode().getAdapter(), env.dataNode().getAdapter().getQuotingStrategy());
         select.getExpression().visit(new EJBQLSelectTranslator(tr));
         String sql = tr.getQuery().getDefaultTemplate();
         assertTrue(sql.endsWith("t0.ARTIST_ID IS NULL OR t1.ARTIST_NAME = 
#bind($id0)"), sql);
diff --git 
a/cayenne/src/test/java/org/apache/cayenne/configuration/runtime/DataDomainProviderTest.java
 
b/cayenne/src/test/java/org/apache/cayenne/configuration/runtime/DataDomainProviderTest.java
index 1dfd33bd3..691d2f839 100644
--- 
a/cayenne/src/test/java/org/apache/cayenne/configuration/runtime/DataDomainProviderTest.java
+++ 
b/cayenne/src/test/java/org/apache/cayenne/configuration/runtime/DataDomainProviderTest.java
@@ -38,6 +38,8 @@ import 
org.apache.cayenne.access.translator.batch.InsertBatchTranslator;
 import org.apache.cayenne.access.translator.batch.UpdateBatchTranslator;
 import 
org.apache.cayenne.access.translator.procedure.DbAdapterDelegatedProcedureTranslator;
 import org.apache.cayenne.access.translator.procedure.ProcedureTranslator;
+import 
org.apache.cayenne.access.translator.ejbql.DbAdapterDelegatedEJBQLTranslator;
+import org.apache.cayenne.access.translator.ejbql.EJBQLTranslator;
 import 
org.apache.cayenne.access.translator.select.DbAdapterDelegatedSelectTranslator;
 import org.apache.cayenne.access.translator.select.SelectTranslator;
 import org.apache.cayenne.access.types.DefaultValueObjectTypeRegistry;
@@ -231,6 +233,7 @@ public class DataDomainProviderTest {
             b.bind(Key.get(BatchTranslator.class, 
BatchTranslator.DELETE)).to(DeleteBatchTranslator.class);
             
b.bind(SelectTranslator.class).to(DbAdapterDelegatedSelectTranslator.class);
             
b.bind(ProcedureTranslator.class).to(DbAdapterDelegatedProcedureTranslator.class);
+            
b.bind(EJBQLTranslator.class).to(DbAdapterDelegatedEJBQLTranslator.class);
 
             b.bind(DataSourceFactory.class).toInstance(new 
MockDataSourceFactory());
             b.bind(JdbcEventLogger.class).to(Slf4jJdbcEventLogger.class);
diff --git a/cayenne/src/test/java/org/apache/cayenne/dba/AutoAdapterIT.java 
b/cayenne/src/test/java/org/apache/cayenne/dba/AutoAdapterIT.java
index aa0d588f8..dd459dd9a 100644
--- a/cayenne/src/test/java/org/apache/cayenne/dba/AutoAdapterIT.java
+++ b/cayenne/src/test/java/org/apache/cayenne/dba/AutoAdapterIT.java
@@ -83,8 +83,8 @@ public class AutoAdapterIT {
                 autoAdapter.getSqlTreeProcessor().getClass());
         assertSame(adapter.getExtendedTypes(),
                 autoAdapter.getExtendedTypes());
-        assertSame(adapter.getEjbqlTranslatorFactory(),
-                autoAdapter.getEjbqlTranslatorFactory());
+        assertSame(adapter.getEjbqlTranslator(),
+                autoAdapter.getEjbqlTranslator());
         // returns a new instance for each call
         assertSame(adapter.getSelectTranslator(select, 
env.dataNode().getEntityResolver()).getClass(),
                 autoAdapter.getSelectTranslator(select, 
env.dataNode().getEntityResolver()).getClass());

Reply via email to