diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeBuilder.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeBuilder.java index 0ee056430..ed687aff8 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeBuilder.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeBuilder.java @@ -53,6 +53,7 @@ public final class SqlTreeBuilder { private final SpiQuery.TemporalMode temporalMode; private SqlTreeNode rootNode; private boolean sqlDistinct; + private final boolean distinctNoLobs; /** * Construct for RawSql query. @@ -65,6 +66,7 @@ public final class SqlTreeBuilder { this.query = null; this.subQuery = false; this.distinctOnPlatform = false; + this.distinctNoLobs = false; this.queryDetail = queryDetail; this.predicates = predicates; this.temporalMode = SpiQuery.TemporalMode.CURRENT; @@ -97,6 +99,7 @@ public final class SqlTreeBuilder { this.predicates = predicates; this.alias = new SqlTreeAlias(request.baseTableAlias(), temporalMode); this.distinctOnPlatform = builder.isPlatformDistinctOn(); + this.distinctNoLobs = builder.isPlatformDistinctNoLobs(); String fromForUpdate = builder.fromForUpdate(query); CQueryHistorySupport historySupport = builder.getHistorySupport(query); CQueryDraftSupport draftSupport = builder.getDraftSupport(query); @@ -266,6 +269,9 @@ public final class SqlTreeBuilder { if (joinList != null) { joinList.add(selectNode); } + if (sqlDistinct && distinctNoLobs) { + selectNode.unselectLobs(); + } return selectNode; } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeNode.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeNode.java index 54632d9ca..d4d22908c 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeNode.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeNode.java @@ -78,4 +78,6 @@ interface SqlTreeNode { * Create the loader for this node. */ SqlTreeLoad createLoad(); + + default void unselectLobs() {}; } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeNodeBean.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeNodeBean.java index 4836fa3fd..6214137c1 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeNodeBean.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlTreeNodeBean.java @@ -26,8 +26,8 @@ class SqlTreeNodeBean implements SqlTreeNode { /** * Set to true if this is a partial object fetch. */ - final boolean partialObject; - final STreeProperty[] properties; + boolean partialObject; + STreeProperty[] properties; /** * Extra where clause added by Where annotation on associated many. */ @@ -399,4 +399,33 @@ class SqlTreeNodeBean implements SqlTreeNode { } return false; } + + + @Override + public void unselectLobs() { + if (children != null) { + for (SqlTreeNode child : children) { + child.unselectLobs(); + } + } + if (hasLob()) { + List lst = new ArrayList<>(); + for (STreeProperty prop : properties) { + if (!prop.isDbLob()) { + lst.add(prop); + } + } + properties = lst.toArray(new STreeProperty[0]); + partialObject = true; + } + } + + private boolean hasLob() { + for (STreeProperty prop : properties) { + if (prop.isDbLob()) { + return true; + } + } + return false; + } }