Skip to content

Commit 1bc5811

Browse files
committed
Fix EQL grammar to accept literals in constructor expressions.
Original Pull Request: #3695
1 parent ce39069 commit 1bc5811

File tree

6 files changed

+27
-21
lines changed

6 files changed

+27
-21
lines changed

spring-data-jpa/src/main/antlr4/org/springframework/data/jpa/repository/query/Eql.g4

+1
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,7 @@ constructor_item
215215
| scalar_expression
216216
| aggregate_expression
217217
| identification_variable
218+
| literal
218219
;
219220

220221
aggregate_expression

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

+7-7
Original file line numberDiff line numberDiff line change
@@ -695,19 +695,19 @@ public QueryTokenStream visitConstructor_expression(EqlParser.Constructor_expres
695695
@Override
696696
public QueryTokenStream visitConstructor_item(EqlParser.Constructor_itemContext ctx) {
697697

698-
QueryRendererBuilder builder = QueryRenderer.builder();
699-
700698
if (ctx.single_valued_path_expression() != null) {
701-
builder.append(visit(ctx.single_valued_path_expression()));
699+
return visit(ctx.single_valued_path_expression());
702700
} else if (ctx.scalar_expression() != null) {
703-
builder.append(visit(ctx.scalar_expression()));
701+
return visit(ctx.scalar_expression());
704702
} else if (ctx.aggregate_expression() != null) {
705-
builder.append(visit(ctx.aggregate_expression()));
703+
return visit(ctx.aggregate_expression());
706704
} else if (ctx.identification_variable() != null) {
707-
builder.append(visit(ctx.identification_variable()));
705+
return visit(ctx.identification_variable());
706+
} else if (ctx.literal() != null) {
707+
return visit(ctx.literal());
708708
}
709709

710-
return builder;
710+
return QueryTokenStream.empty();
711711
}
712712

713713
@Override

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

+10-10
Original file line numberDiff line numberDiff line change
@@ -1309,7 +1309,7 @@ public QueryTokenStream visitJdbcTimeLiteral(HqlParser.JdbcTimeLiteralContext ct
13091309

13101310
@Override
13111311
public QueryTokenStream visitGenericTemporalLiteralText(HqlParser.GenericTemporalLiteralTextContext ctx) {
1312-
return QueryRendererBuilder.from(QueryTokens.token(ctx.STRING_LITERAL()));
1312+
return QueryTokenStream.ofToken(ctx.STRING_LITERAL());
13131313
}
13141314

13151315
@Override
@@ -1338,12 +1338,12 @@ public QueryTokenStream visitGeneralizedLiteral(HqlParser.GeneralizedLiteralCont
13381338

13391339
@Override
13401340
public QueryTokenStream visitGeneralizedLiteralType(HqlParser.GeneralizedLiteralTypeContext ctx) {
1341-
return QueryRendererBuilder.from(QueryTokens.token(ctx.STRING_LITERAL()));
1341+
return QueryTokenStream.ofToken(ctx.STRING_LITERAL());
13421342
}
13431343

13441344
@Override
13451345
public QueryTokenStream visitGeneralizedLiteralText(HqlParser.GeneralizedLiteralTextContext ctx) {
1346-
return QueryRendererBuilder.from(QueryTokens.token(ctx.STRING_LITERAL()));
1346+
return QueryTokenStream.ofToken(ctx.STRING_LITERAL());
13471347
}
13481348

13491349
@Override
@@ -1414,37 +1414,37 @@ public QueryTokenStream visitOffsetWithMinutes(HqlParser.OffsetWithMinutesContex
14141414

14151415
@Override
14161416
public QueryTokenStream visitYear(HqlParser.YearContext ctx) {
1417-
return QueryRendererBuilder.from(QueryTokens.token(ctx.INTEGER_LITERAL()));
1417+
return QueryTokenStream.ofToken(ctx.INTEGER_LITERAL());
14181418
}
14191419

14201420
@Override
14211421
public QueryTokenStream visitMonth(HqlParser.MonthContext ctx) {
1422-
return QueryRendererBuilder.from(QueryTokens.token(ctx.INTEGER_LITERAL()));
1422+
return QueryTokenStream.ofToken(ctx.INTEGER_LITERAL());
14231423
}
14241424

14251425
@Override
14261426
public QueryTokenStream visitDay(HqlParser.DayContext ctx) {
1427-
return QueryRendererBuilder.from(QueryTokens.token(ctx.INTEGER_LITERAL()));
1427+
return QueryTokenStream.ofToken(ctx.INTEGER_LITERAL());
14281428
}
14291429

14301430
@Override
14311431
public QueryTokenStream visitHour(HqlParser.HourContext ctx) {
1432-
return QueryRendererBuilder.from(QueryTokens.token(ctx.INTEGER_LITERAL()));
1432+
return QueryTokenStream.ofToken(ctx.INTEGER_LITERAL());
14331433
}
14341434

14351435
@Override
14361436
public QueryTokenStream visitMinute(HqlParser.MinuteContext ctx) {
1437-
return QueryRendererBuilder.from(QueryTokens.token(ctx.INTEGER_LITERAL()));
1437+
return QueryTokenStream.ofToken(ctx.INTEGER_LITERAL());
14381438
}
14391439

14401440
@Override
14411441
public QueryTokenStream visitSecond(HqlParser.SecondContext ctx) {
1442-
return QueryRendererBuilder.from(QueryTokens.token(ctx.INTEGER_LITERAL()));
1442+
return QueryTokenStream.ofToken(ctx.INTEGER_LITERAL());
14431443
}
14441444

14451445
@Override
14461446
public QueryTokenStream visitZoneId(HqlParser.ZoneIdContext ctx) {
1447-
return QueryRendererBuilder.from(QueryTokens.token(ctx.STRING_LITERAL()));
1447+
return QueryTokenStream.ofToken(ctx.STRING_LITERAL());
14481448
}
14491449

14501450
@Override

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

+5
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,11 @@ void numericLiterals() {
128128
assertQuery("SELECT s FROM Stat s WHERE s.ratio > 3.14e32D");
129129
}
130130

131+
@Test // GH-3308
132+
void newWithStrings() {
133+
assertQuery("select new com.example.demo.SampleObject(se.id, se.sampleValue, \"java\") from SampleEntity se");
134+
}
135+
131136
@Test
132137
void orderByClause() {
133138

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -63,11 +63,11 @@ void shouldRewriteQueriesWithSubselect() {
6363
void shouldNotTranslateConstructorExpressionQuery() {
6464

6565
JpaQueryEnhancer.EqlQueryParser parser = JpaQueryEnhancer.EqlQueryParser
66-
.parseQuery("SELECT NEW String(p) from Person p");
66+
.parseQuery("SELECT NEW Foo(p) from Person p");
6767

6868
QueryTokenStream visit = getTransformer(parser).visit(parser.getContext());
6969

70-
assertThat(QueryRenderer.TokenRenderer.render(visit)).isEqualTo("SELECT NEW String(p) from Person p");
70+
assertThat(QueryRenderer.TokenRenderer.render(visit)).isEqualTo("SELECT NEW Foo(p) from Person p");
7171
}
7272

7373
@Test

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -63,11 +63,11 @@ void shouldRewriteQueriesWithSubselect() {
6363
void shouldNotTranslateConstructorExpressionQuery() {
6464

6565
JpaQueryEnhancer.JpqlQueryParser parser = JpaQueryEnhancer.JpqlQueryParser
66-
.parseQuery("SELECT NEW String(p) from Person p");
66+
.parseQuery("SELECT NEW Foo(p) from Person p");
6767

6868
QueryTokenStream visit = getTransformer(parser).visit(parser.getContext());
6969

70-
assertThat(QueryRenderer.TokenRenderer.render(visit)).isEqualTo("SELECT NEW String(p) from Person p");
70+
assertThat(QueryRenderer.TokenRenderer.render(visit)).isEqualTo("SELECT NEW Foo(p) from Person p");
7171
}
7272

7373
@Test

0 commit comments

Comments
 (0)