From f973c36a02874c4b908024f9bdd7217621af6292 Mon Sep 17 00:00:00 2001 From: Savva Kolbachev Date: Fri, 19 Dec 2014 17:16:52 +0300 Subject: [PATCH] CAY-1979 | fix Prefetches on Many-to-Many Relationships with Longvarchar --- .../access/trans/SelectTranslator.java | 30 +++++++++++-------- 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/trans/SelectTranslator.java b/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/trans/SelectTranslator.java index d3543df41d..a7ac55eb3c 100644 --- a/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/trans/SelectTranslator.java +++ b/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/trans/SelectTranslator.java @@ -19,16 +19,6 @@ package org.apache.cayenne.access.trans; -import java.sql.Types; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Set; - import org.apache.cayenne.CayenneRuntimeException; import org.apache.cayenne.access.jdbc.ColumnDescriptor; import org.apache.cayenne.dba.QuotingStrategy; @@ -55,6 +45,16 @@ import org.apache.cayenne.util.EqualsBuilder; import org.apache.cayenne.util.HashCodeBuilder; +import java.sql.Types; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Set; + /** * A builder of JDBC PreparedStatements based on Cayenne SelectQueries. Translates * SelectQuery to parameterized SQL string and wraps it in a PreparedStatement. @@ -416,8 +416,14 @@ private void visitRelationship(ArcProperty property) { .resolvePath(pathExp, getPathAliases())) { if (component.getRelationship() != null) { - dbRelationshipAdded(component.getRelationship(), component - .getJoinType(), null); + // do not invoke dbRelationshipAdded(), invoke + // pushJoin() instead. This is to prevent + // 'forcingDistinct' flipping to true, that will result + // in unneeded extra processing and sometimes in invalid + // results (see CAY-1979). Distinctness of each row is + // guaranteed by the prefetch query semantics - we + // include target ID in the result columns + getJoinStack().pushJoin(component.getRelationship(), component.getJoinType(), null); } lastComponent = component;