diff --git a/integration/querydsl/expressions/src/main/java/com/blazebit/persistence/querydsl/BlazeCriteriaBuilderRenderer.java b/integration/querydsl/expressions/src/main/java/com/blazebit/persistence/querydsl/BlazeCriteriaBuilderRenderer.java index 29064f172a..785a6a5f7b 100644 --- a/integration/querydsl/expressions/src/main/java/com/blazebit/persistence/querydsl/BlazeCriteriaBuilderRenderer.java +++ b/integration/querydsl/expressions/src/main/java/com/blazebit/persistence/querydsl/BlazeCriteriaBuilderRenderer.java @@ -66,6 +66,7 @@ import com.querydsl.core.types.ParamExpression; import com.querydsl.core.types.Path; import com.querydsl.core.types.Predicate; +import com.querydsl.core.types.Projections; import com.querydsl.core.types.SubQueryExpression; import com.querydsl.core.types.TemplateExpression; import com.querydsl.core.types.Visitor; @@ -260,14 +261,14 @@ public Object visit(SubQueryExpression subQuery, Object criteriaBuilder) { renderGroupBy(subQueryMetadata, (GroupByBuilder) criteriaBuilder); renderHaving(subQueryMetadata, (HavingBuilder) criteriaBuilder); - Expression select = subQueryMetadata.getProjection(); + Expression select = extractExpression(subQueryMetadata); if (select instanceof FactoryExpression && criteriaBuilder instanceof FullQueryBuilder) { FactoryExpression factoryExpression = (FactoryExpression) select; FullQueryBuilder fullQueryBuilder = (FullQueryBuilder) criteriaBuilder; criteriaBuilder = fullQueryBuilder.selectNew(new FactoryExpressionObjectBuilder(factoryExpression)); } else { - List> projection = expandProjection(subQueryMetadata.getProjection()); + List> projection = expandProjection(extractExpression(subQueryMetadata)); if (criteriaBuilder instanceof SelectBaseCTECriteriaBuilder) { SelectBaseCTECriteriaBuilder selectBaseCriteriaBuilder = (SelectBaseCTECriteriaBuilder) criteriaBuilder; @@ -905,6 +906,27 @@ private static String relativePathString(Path root, Path path) { return pathString.toString(); } + private static Expression extractExpression(QueryMetadata meta) { + Expression projection = meta.getProjection(); + if (projection != null) { + return projection; + } + + List joins = meta.getJoins(); + if (joins == null || joins.isEmpty()) { + return null; + } + + JoinExpression firstJoin = joins.get(0); + if (firstJoin == null) { + return null; + } + + return firstJoin.getType() == com.querydsl.core.JoinType.DEFAULT + ? Projections.constructor(firstJoin.getTarget().getType()) + : null; + } + /** * Visitor that parses {@link JPQLNextOps#WITH_ALIAS}. */ @@ -1523,7 +1545,7 @@ public Object visit(SubQueryExpression expr, Object context) { renderCTEs(metadata); - metadata.getProjection().accept(this, context); + extractExpression(metadata).accept(this, context); for (QueryFlag flag : metadata.getFlags()) { flag.getFlag().accept(this, context);