Skip to content

Commit f92dc1e

Browse files
authored
Merge pull request #1 from domaframework/add-aggregate-strategy
Add aggregate strategy for Employee-Department association
2 parents 262cd5b + 862c28a commit f92dc1e

File tree

8 files changed

+127
-13
lines changed

8 files changed

+127
-13
lines changed

.github/workflows/ci.yml

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
name: CI
2+
3+
on:
4+
push:
5+
branches: [ master, main ]
6+
pull_request:
7+
branches: [ master, main ]
8+
9+
jobs:
10+
build:
11+
runs-on: ubuntu-latest
12+
13+
steps:
14+
- uses: actions/checkout@v4
15+
16+
- name: Set up JDK 17
17+
uses: actions/setup-java@v4
18+
with:
19+
java-version: '17'
20+
distribution: 'temurin'
21+
22+
- name: Setup Gradle
23+
uses: gradle/actions/[email protected]
24+
25+
- name: Check code formatting
26+
run: ./gradlew spotlessCheck
27+
28+
- name: Build with generated files
29+
run: ./gradlew clean generateAll build
30+
31+
- name: Run application
32+
run: ./gradlew run
33+
34+
- name: Upload test results
35+
uses: actions/upload-artifact@v4
36+
if: always()
37+
with:
38+
name: test-results
39+
path: build/test-results/test/
40+
41+
- name: Upload build reports
42+
uses: actions/upload-artifact@v4
43+
if: always()
44+
with:
45+
name: build-reports
46+
path: build/reports/

build.gradle.kts

Lines changed: 49 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,10 @@ application {
3131
mainClass.set("com.example.Main")
3232
}
3333

34+
var daoPackagePath = "src/main/java/com/example/dao"
35+
var entityPackagePath = "src/main/java/com/example/entity"
36+
var sqlFileDirPath = "src/main/resources/META-INF/com/example/dao"
37+
3438
tasks {
3539
test {
3640
useJUnitPlatform()
@@ -48,10 +52,6 @@ tasks {
4852
dependsOn("generateDAOs", "generateEntities", "generateSqlFiles")
4953
}
5054

51-
var daoPackagePath = "src/main/java/com/example/dao"
52-
var entityPackagePath = "src/main/java/com/example/entity"
53-
var sqlFileDirPath = "src/main/resources/META-INF/com/example/dao"
54-
5555
register("generateDAOs") {
5656
dependsOn("generateEntities")
5757
doLast {
@@ -61,6 +61,8 @@ tasks {
6161
(1..generationSize).forEach { i ->
6262
val employeeDaoFile = File(sourceDir, "Employee${i}Dao.java")
6363
writeEmployeeDaoCode(employeeDaoFile, i)
64+
val employeeAggregateStrategyFile = File(sourceDir, "Employee${i}AggregateStrategy.java")
65+
writeEmployeeAggregateStrategyCode(employeeAggregateStrategyFile, i)
6466
}
6567
println("Generated DAO files in src/main/java/com/example/dao")
6668
}
@@ -87,7 +89,15 @@ tasks {
8789
dir.mkdirs()
8890

8991
val sqlFile = File(dir, "selectById.sql")
90-
sqlFile.writeText("select /*%expand*/* from employee$i where id = /*id*/0\n")
92+
sqlFile.writeText(
93+
"""
94+
SELECT /*%expand*/*
95+
FROM employee$i e
96+
INNER JOIN department$i d
97+
ON e.department_id = d.id
98+
WHERE e.id = /*id*/0
99+
""".trimIndent(),
100+
)
91101
}
92102
println("Generated SQL files in src/main/resources/META-INF/com/example/dao/EmployeeXxxDao")
93103
}
@@ -125,13 +135,43 @@ fun writeEmployeeDaoCode(
125135
@Delete
126136
int delete(Employee$i entity);
127137
128-
@Select
138+
@Select(aggregateStrategy = Employee${i}AggregateStrategy.class)
129139
Employee$i selectById(Long id);
130140
}
131141
""".trimIndent(),
132142
)
133143
}
134144

145+
fun writeEmployeeAggregateStrategyCode(
146+
file: File,
147+
i: Int,
148+
) {
149+
file.writeText(
150+
"""
151+
package com.example.dao;
152+
153+
import org.seasar.doma.AggregateStrategy;
154+
import org.seasar.doma.AssociationLinker;
155+
156+
import java.util.function.BiConsumer;
157+
158+
import com.example.entity.Department$i;
159+
import com.example.entity.Employee$i;
160+
161+
@AggregateStrategy(root = Employee$i.class, tableAlias = "e")
162+
public interface Employee${i}AggregateStrategy {
163+
164+
@AssociationLinker(propertyPath = "department", tableAlias = "d")
165+
BiConsumer<Employee$i, Department$i> department =
166+
(e, d) -> {
167+
e.department = d;
168+
d.employees.add(e);
169+
};
170+
}
171+
""".trimIndent(),
172+
)
173+
}
174+
135175
fun writeEmployeeCode(
136176
file: File,
137177
i: Int,
@@ -191,6 +231,7 @@ fun writeDepartmentCode(
191231
"""
192232
package com.example.entity;
193233
234+
import java.util.ArrayList;
194235
import java.util.List;
195236
196237
import org.seasar.doma.Association;
@@ -211,7 +252,7 @@ fun writeDepartmentCode(
211252
@Version
212253
public Integer version;
213254
@Association
214-
public List<Employee$i> employees;
255+
public List<Employee$i> employees = new ArrayList<>();
215256
}
216257
""".trimIndent(),
217258
)
@@ -221,7 +262,7 @@ spotless {
221262
java {
222263
googleJavaFormat(libs.versions.googleJavaFormat.get())
223264
target("src/*/java/**/*.java")
224-
targetExclude("**/generated/**")
265+
targetExclude("**/generated/**", "$daoPackagePath/**", "$entityPackagePath/**", "$sqlFileDirPath/**")
225266
}
226267
kotlin {
227268
target("*.gradle.kts")

gradle/libs.versions.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[versions]
22
junit = "5.10.0"
3-
doma = "3.9.1-SNAPSHOT"
3+
doma = "3.9.0"
44
h2 = "2.3.232"
55
slf4j = "2.0.17"
66
logback = "1.5.18"

src/main/java/com/example/Department.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.example;
22

33
import com.example.domain.Name;
4+
import java.util.ArrayList;
45
import java.util.List;
56
import org.seasar.doma.Association;
67
import org.seasar.doma.Entity;
@@ -18,5 +19,5 @@ public class Department {
1819

1920
public Name name;
2021
@Version public Integer version;
21-
@Association public List<Employee> employees;
22+
@Association public List<Employee> employees = new ArrayList<>();
2223
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package com.example;
2+
3+
import java.util.function.BiConsumer;
4+
import org.seasar.doma.AggregateStrategy;
5+
import org.seasar.doma.AssociationLinker;
6+
7+
@AggregateStrategy(root = Employee.class, tableAlias = "e")
8+
public interface EmployeeAggregateStrategy {
9+
10+
@AssociationLinker(propertyPath = "department", tableAlias = "d")
11+
BiConsumer<Employee, Department> department =
12+
(e, d) -> {
13+
e.department = d;
14+
d.employees.add(e);
15+
};
16+
}

src/main/java/com/example/EmployeeDao.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ public interface EmployeeDao {
1818
@Delete
1919
int delete(Employee entity);
2020

21-
@Select
21+
@Select(aggregateStrategy = EmployeeAggregateStrategy.class)
2222
Employee selectById(Long id);
2323

2424
@Script

src/main/java/com/example/Main.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.example;
22

3+
import java.util.Objects;
34
import org.seasar.doma.jdbc.Naming;
45
import org.seasar.doma.jdbc.SimpleConfig;
56
import org.seasar.doma.slf4j.Slf4jJdbcLogger;
@@ -16,10 +17,15 @@ public static void main(String[] args) {
1617
.naming(Naming.SNAKE_LOWER_CASE)
1718
.jdbcLogger(new Slf4jJdbcLogger())
1819
.build();
19-
var employeeDao = new EmployeeDaoImpl(config);
20+
EmployeeDao employeeDao = new EmployeeDaoImpl(config);
2021
employeeDao.create();
2122
var employee = employeeDao.selectById(1L);
2223

24+
Objects.requireNonNull(employee);
25+
Objects.requireNonNull(employee.name);
26+
Objects.requireNonNull(employee.department);
27+
2328
logger.info(employee.name.value()); // John Smith
29+
logger.info(employee.department.name.value()); // Engineering
2430
}
2531
}
Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,5 @@
1-
select /*%expand*/* from employee where id = /*id*/0
1+
SELECT /*%expand*/*
2+
FROM employee e
3+
INNER JOIN department d
4+
ON e.department_id = d.id
5+
WHERE e.id = /*id*/0

0 commit comments

Comments
 (0)