Skip to content

Commit fd914b7

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

File tree

4 files changed

+30
-2
lines changed

4 files changed

+30
-2
lines changed

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -87,8 +87,8 @@ orderedQuery
8787
;
8888

8989
query
90-
: selectClause fromClause? whereClause? (groupByClause havingClause?)? # SelectQuery
91-
| fromClause whereClause? (groupByClause havingClause?)? selectClause? # FromQuery
90+
: selectClause fromClause? whereClause? groupByClause? havingClause? # SelectQuery
91+
| fromClause whereClause? groupByClause? havingClause? selectClause? # FromQuery
9292
;
9393

9494
queryOrder

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

+8
Original file line numberDiff line numberDiff line change
@@ -603,6 +603,14 @@ SELECT c.country, COUNT(c)
603603
GROUP BY c.country
604604
HAVING COUNT(c) > 30
605605
""");
606+
607+
assertQuery("""
608+
SELECT COUNT(f)
609+
FROM FooEntity f
610+
WHERE f.name IN ('Y', 'Basic', 'Remit')
611+
AND f.size = 10
612+
HAVING COUNT(f) > 0
613+
""");
606614
}
607615

608616
@Test

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

+12
Original file line numberDiff line numberDiff line change
@@ -622,6 +622,18 @@ HAVING COUNT(o) >= 5
622622
""");
623623
}
624624

625+
@Test
626+
void shouldRenderHavingWithFunction() {
627+
628+
assertQuery("""
629+
SELECT COUNT(f)
630+
FROM FooEntity f
631+
WHERE f.name IN ('Y', 'Basic', 'Remit')
632+
AND f.size = 10
633+
HAVING COUNT(f) > 0
634+
""");
635+
}
636+
625637
@Test
626638
void theRest8() {
627639

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

+8
Original file line numberDiff line numberDiff line change
@@ -604,6 +604,14 @@ SELECT c.country, COUNT(c)
604604
GROUP BY c.country
605605
HAVING COUNT(c) > 30
606606
""");
607+
608+
assertQuery("""
609+
SELECT COUNT(f)
610+
FROM FooEntity f
611+
WHERE f.name IN ('Y', 'Basic', 'Remit')
612+
AND f.size = 10
613+
HAVING COUNT(f) > 0
614+
""");
607615
}
608616

609617
@Test

0 commit comments

Comments
 (0)