diff --git a/build.gradle.kts b/build.gradle.kts index 7026cb6..342acaf 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -194,6 +194,9 @@ fun writeEmployeeAggregateStrategyCode( @AggregateStrategy(root = Employee$i.class, tableAlias = "e") public interface Employee${i}AggregateStrategy { + + @AssociationLinker(propertyPath = "manager", tableAlias = "m") + BiConsumer manager = (e, m) -> e.manager = m; @AssociationLinker(propertyPath = "department", tableAlias = "d") BiConsumer department = @@ -300,6 +303,8 @@ fun writeSelectByIdSqlFile( """ SELECT /*%expand*/* FROM employee$i e + LEFT JOIN employee$i m + ON e.manager_id = m.id INNER JOIN department$i d ON e.department_id = d.id WHERE e.id = /*id*/0 @@ -445,8 +450,18 @@ fun writeEmployeeDaoTestCode( assertNotNull(employee); assertNotNull(employee.name); assertNotNull(employee.department); + assertNull(employee.manager); assertEquals("John Smith", employee.name.value()); assertEquals("Engineering", employee.department.name.value()); + + var employee2 = employeeDao.selectById(2L); + assertNotNull(employee2); + assertNotNull(employee2.name); + assertNotNull(employee2.department); + assertNotNull(employee2.manager); + assertEquals("Sarah Johnson", employee2.name.value()); + assertEquals("Engineering", employee2.department.name.value()); + assertEquals(employee.id, employee2.manager.id); } } """.trimIndent(), diff --git a/src/main/java/com/example/EmployeeAggregateStrategy.java b/src/main/java/com/example/EmployeeAggregateStrategy.java index 44d79ff..b8728e6 100644 --- a/src/main/java/com/example/EmployeeAggregateStrategy.java +++ b/src/main/java/com/example/EmployeeAggregateStrategy.java @@ -7,6 +7,9 @@ @AggregateStrategy(root = Employee.class, tableAlias = "e") public interface EmployeeAggregateStrategy { + @AssociationLinker(propertyPath = "manager", tableAlias = "m") + BiConsumer manager = (e, m) -> e.manager = m; + @AssociationLinker(propertyPath = "department", tableAlias = "d") BiConsumer department = (e, d) -> { diff --git a/src/main/resources/META-INF/com/example/EmployeeDao/selectById.sql b/src/main/resources/META-INF/com/example/EmployeeDao/selectById.sql index 1e030aa..4f1448a 100644 --- a/src/main/resources/META-INF/com/example/EmployeeDao/selectById.sql +++ b/src/main/resources/META-INF/com/example/EmployeeDao/selectById.sql @@ -1,5 +1,7 @@ SELECT /*%expand*/* FROM employee e + LEFT JOIN employee m + ON e.manager_id = m.id INNER JOIN department d ON e.department_id = d.id WHERE e.id = /*id*/0 diff --git a/src/test/java/com/example/EmployeeDaoTest.java b/src/test/java/com/example/EmployeeDaoTest.java index 34be503..f5f9028 100644 --- a/src/test/java/com/example/EmployeeDaoTest.java +++ b/src/test/java/com/example/EmployeeDaoTest.java @@ -56,7 +56,17 @@ void selectById() { assertNotNull(employee); assertNotNull(employee.name); assertNotNull(employee.department); + assertNull(employee.manager); assertEquals("John Smith", employee.name.value()); assertEquals("Engineering", employee.department.name.value()); + + var employee2 = employeeDao.selectById(2L); + assertNotNull(employee2); + assertNotNull(employee2.name); + assertNotNull(employee2.department); + assertNotNull(employee2.manager); + assertEquals("Sarah Johnson", employee2.name.value()); + assertEquals("Engineering", employee2.department.name.value()); + assertEquals(employee.id, employee2.manager.id); } }