Skip to content

Commit 3235d70

Browse files
committed
Generate the GROUP BY clause automatically.
We generate it when it is empty and the SELECT clause includes any aggregate functions.
1 parent 92263eb commit 3235d70

File tree

3 files changed

+35
-0
lines changed

3 files changed

+35
-0
lines changed

doma-core/src/main/java/org/seasar/doma/jdbc/criteria/query/SelectBuilder.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package org.seasar.doma.jdbc.criteria.query;
22

3+
import static java.util.stream.Collectors.toList;
4+
35
import java.util.List;
46
import java.util.Objects;
57
import java.util.function.Function;
@@ -14,6 +16,7 @@
1416
import org.seasar.doma.jdbc.criteria.context.Join;
1517
import org.seasar.doma.jdbc.criteria.context.JoinKind;
1618
import org.seasar.doma.jdbc.criteria.context.SelectContext;
19+
import org.seasar.doma.jdbc.criteria.declaration.AggregateFunction;
1720
import org.seasar.doma.jdbc.criteria.def.EntityDef;
1821
import org.seasar.doma.jdbc.criteria.def.PropertyDef;
1922

@@ -128,6 +131,16 @@ private void where() {
128131
}
129132

130133
private void groupBy() {
134+
if (context.groupBy.isEmpty()) {
135+
List<PropertyDef<?>> propertyDefs = context.allPropertyDefs();
136+
if (propertyDefs.stream().anyMatch(p -> p instanceof AggregateFunction<?>)) {
137+
List<PropertyDef<?>> groupKeys =
138+
propertyDefs.stream()
139+
.filter(p -> !(p instanceof AggregateFunction<?>))
140+
.collect(toList());
141+
context.groupBy.addAll(groupKeys);
142+
}
143+
}
131144
if (!context.groupBy.isEmpty()) {
132145
buf.appendSql(" group by ");
133146
for (PropertyDef<?> p : context.groupBy) {

doma-core/src/test/java/org/seasar/doma/jdbc/criteria/NativeSqlSelectTest.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -709,6 +709,17 @@ void groupBy_empty() {
709709
assertEquals("select t0_.ID from EMP t0_", sql.getFormattedSql());
710710
}
711711

712+
@Test
713+
void groupBy_auto_generation() {
714+
Emp_ e = new Emp_();
715+
Buildable<?> stmt = nativeSql.from(e).select(e.id, e.salary, count(e.name), max(e.id));
716+
717+
Sql<?> sql = stmt.asSql();
718+
assertEquals(
719+
"select t0_.ID, t0_.SALARY, count(t0_.NAME), max(t0_.ID) from EMP t0_ group by t0_.ID, t0_.SALARY",
720+
sql.getFormattedSql());
721+
}
722+
712723
@Test
713724
void having() {
714725
Emp_ e = new Emp_();

test-criteria/src/test/java/example/NativeSqlSelectTest.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,17 @@ void groupBy() {
177177
assertEquals(3, list.size());
178178
}
179179

180+
@Test
181+
void groupBy_auto_generation() {
182+
Employee_ e = new Employee_();
183+
184+
Listable<Tuple2<Integer, Long>> stmt = nativeSql.from(e).select(e.departmentId, count());
185+
186+
List<Tuple2<Integer, Long>> list = stmt.fetch();
187+
188+
assertEquals(3, list.size());
189+
}
190+
180191
@Test
181192
void having() {
182193
Employee_ e = new Employee_();

0 commit comments

Comments
 (0)