Skip to content

Commit 82b28a4

Browse files
hacking
1 parent 25beda5 commit 82b28a4

File tree

2 files changed

+35
-2
lines changed

2 files changed

+35
-2
lines changed

spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/HqlSortedQueryTransformer.java

+31-1
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import org.springframework.data.jpa.repository.query.QueryRenderer.QueryRendererBuilder;
2424
import org.springframework.lang.Nullable;
2525
import org.springframework.util.Assert;
26+
import org.springframework.util.ObjectUtils;
2627

2728
/**
2829
* An ANTLR {@link org.antlr.v4.runtime.tree.ParseTreeVisitor} that transforms a parsed HQL query.
@@ -35,7 +36,7 @@
3536
class HqlSortedQueryTransformer extends HqlQueryRenderer {
3637

3738
private final JpaQueryTransformerSupport transformerSupport = new JpaQueryTransformerSupport();
38-
private final Sort sort;
39+
private Sort sort;
3940
private final @Nullable String primaryFromAlias;
4041

4142
HqlSortedQueryTransformer(Sort sort, @Nullable String primaryFromAlias) {
@@ -46,9 +47,38 @@ class HqlSortedQueryTransformer extends HqlQueryRenderer {
4647
this.primaryFromAlias = primaryFromAlias;
4748
}
4849

50+
51+
public QueryTokenStream visitQueryExpression(HqlParser.QueryExpressionContext ctx) {
52+
53+
if(ObjectUtils.isEmpty(ctx.setOperator())) {
54+
return super.visitQueryExpression(ctx);
55+
}
56+
57+
QueryRendererBuilder builder = QueryRenderer.builder();
58+
if (ctx.withClause() != null) {
59+
builder.appendExpression(visit(ctx.withClause()));
60+
}
61+
62+
Sort tmp = this.sort;
63+
this.sort = Sort.unsorted();
64+
builder.append(visit(ctx.orderedQuery(0)));
65+
this.sort = tmp;
66+
67+
for (int i = 1; i < ctx.orderedQuery().size(); i++) {
68+
69+
builder.append(visit(ctx.setOperator(i - 1)));
70+
builder.append(visit(ctx.orderedQuery(i)));
71+
}
72+
73+
74+
return builder;
75+
}
76+
77+
4978
@Override
5079
public QueryRendererBuilder visitOrderedQuery(HqlParser.OrderedQueryContext ctx) {
5180

81+
5282
QueryRendererBuilder builder = QueryRenderer.builder();
5383

5484
if (ctx.query() != null) {

spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/query/HqlQueryTransformerTests.java

+4-1
Original file line numberDiff line numberDiff line change
@@ -1070,8 +1070,11 @@ void sortShouldBeAppendedWithSpacingInCaseOfSetOperator() {
10701070

10711071
String source = "SELECT tb FROM Test tb WHERE (tb.type='A') UNION SELECT tb FROM Test tb WHERE (tb.type='B')";
10721072
String target = createQueryFor(source, Sort.by("Type").ascending());
1073+
1074+
System.out.println("target: " + target);
10731075

1074-
assertThat(target).contains(" UNION SELECT ").doesNotContainPattern(Pattern.compile(".*\\SUNION"));
1076+
assertThat(target).isEqualTo("SELECT tb FROM Test tb WHERE (tb.type = 'A') UNION SELECT tb FROM Test tb WHERE (tb.type = 'B') order by tb.Type asc");
1077+
// assertThat(target).contains(" UNION SELECT ").doesNotContainPattern(Pattern.compile(".*\\SUNION"));
10751078
}
10761079

10771080
@ParameterizedTest // GH-3427

0 commit comments

Comments
 (0)