Skip to content

Commit 3f0bd62

Browse files
committed
Allow HQL HAVING without enforcing GROUP BY.
Closes #3840
1 parent 2016417 commit 3f0bd62

File tree

4 files changed

+30
-2
lines changed

4 files changed

+30
-2
lines changed

Diff for: spring-data-jpa/src/main/antlr4/org/springframework/data/jpa/repository/query/Hql.g4

+2-2
Original file line numberDiff line numberDiff line change
@@ -89,8 +89,8 @@ orderedQuery
8989
;
9090

9191
query
92-
: selectClause fromClause? whereClause? (groupByClause havingClause?)? # SelectQuery
93-
| fromClause whereClause? (groupByClause havingClause?)? selectClause? # FromQuery
92+
: selectClause fromClause? whereClause? groupByClause? havingClause? # SelectQuery
93+
| fromClause whereClause? groupByClause? havingClause? selectClause? # FromQuery
9494
;
9595

9696
queryOrder

Diff for: spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/query/EqlQueryRendererTests.java

+8
Original file line numberDiff line numberDiff line change
@@ -597,6 +597,14 @@ SELECT c.country, COUNT(c)
597597
GROUP BY c.country
598598
HAVING COUNT(c) > 30
599599
""");
600+
601+
assertQuery("""
602+
SELECT COUNT(f)
603+
FROM FooEntity f
604+
WHERE f.name IN ('Y', 'Basic', 'Remit')
605+
AND f.size = 10
606+
HAVING COUNT(f) > 0
607+
""");
600608
}
601609

602610
@Test

Diff for: spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/query/HqlQueryRendererTests.java

+12
Original file line numberDiff line numberDiff line change
@@ -791,6 +791,18 @@ HAVING COUNT(o) >= 5
791791
""");
792792
}
793793

794+
@Test
795+
void shouldRenderHavingWithFunction() {
796+
797+
assertQuery("""
798+
SELECT COUNT(f)
799+
FROM FooEntity f
800+
WHERE f.name IN ('Y', 'Basic', 'Remit')
801+
AND f.size = 10
802+
HAVING COUNT(f) > 0
803+
""");
804+
}
805+
794806
@Test
795807
void theRest8() {
796808

Diff for: spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/query/JpqlQueryRendererTests.java

+8
Original file line numberDiff line numberDiff line change
@@ -598,6 +598,14 @@ SELECT c.country, COUNT(c)
598598
GROUP BY c.country
599599
HAVING COUNT(c) > 30
600600
""");
601+
602+
assertQuery("""
603+
SELECT COUNT(f)
604+
FROM FooEntity f
605+
WHERE f.name IN ('Y', 'Basic', 'Remit')
606+
AND f.size = 10
607+
HAVING COUNT(f) > 0
608+
""");
601609
}
602610

603611
@Test

0 commit comments

Comments
 (0)