diff --git a/spring-boot-service-template-database/spring-boot-service-template-database-jpa/src/test/java/com/lanyuanxiaoyao/service/template/database/jpa/TestApplication.java b/spring-boot-service-template-database/spring-boot-service-template-database-jpa/src/test/java/com/lanyuanxiaoyao/service/template/database/jpa/TestApplication.java index 0004eb9..429faf6 100644 --- a/spring-boot-service-template-database/spring-boot-service-template-database-jpa/src/test/java/com/lanyuanxiaoyao/service/template/database/jpa/TestApplication.java +++ b/spring-boot-service-template-database/spring-boot-service-template-database-jpa/src/test/java/com/lanyuanxiaoyao/service/template/database/jpa/TestApplication.java @@ -266,11 +266,12 @@ public class TestApplication extends AbstractTestApplication { Assert.isTrue(result3_jpa.size() == 1, "字符串操作符查询失败 (%d)".formatted(result3_jpa.size())); formatLog("3. 字符串操作符查询 Fenix"); - log.info("Fenix框架当前版本不支持以下字符串操作符:"); - log.info(" - cb.length() - 字符串长度函数"); - log.info(" - cb.substring() - 子字符串提取函数"); - log.info(" - cb.lower() / cb.upper() - 大小写转换函数 (不支持直接在条件中使用)"); - log.info("Fenix支持的部分实现:"); + log.info(""" + Fenix框架当前版本不支持以下字符串操作符: + - cb.length() - 字符串长度函数 + - cb.substring() - 子字符串提取函数 + - cb.lower() / cb.upper() - 大小写转换函数 (不支持直接在条件中使用) + Fenix支持的部分实现:"""); var result3_fenix = employeeRepository.findAll( builder -> builder.andStartsWith(Employee.Fields.name, "A") .andNotStartsWith(Employee.Fields.name, "C") @@ -357,11 +358,12 @@ public class TestApplication extends AbstractTestApplication { Assert.isTrue(result5_jpa.size() == 2, "集合操作符查询失败 (%d)".formatted(result5_jpa.size())); formatLog("5. 集合操作符查询 Fenix"); - log.info("Fenix框架当前版本不支持以下集合操作符:"); - log.info(" - cb.isNotEmpty() / cb.isEmpty() - 集合非空/空判断"); - log.info(" - cb.isMember() / cb.isNotMember() - 集合成员判断"); - log.info(" - cb.size() - 集合大小函数"); - log.info("这些集合操作在JPA Criteria中需要复杂的join处理,Fenix当前不支持"); + log.info(""" + Fenix框架当前版本不支持以下集合操作符: + - cb.isNotEmpty() / cb.isEmpty() - 集合非空/空判断 + - cb.isMember() / cb.isNotMember() - 集合成员判断 + - cb.size() - 集合大小函数 + 这些集合操作在JPA Criteria中需要复杂的join处理,Fenix当前不支持"""); formatLog("5. 集合操作符查询 QueryDSL"); var result5_querydsl = employeeRepository.findAll( @@ -406,8 +408,9 @@ public class TestApplication extends AbstractTestApplication { Assert.isTrue(result6_jpa.size() == 2, "逻辑操作符查询失败 (%d)".formatted(result6_jpa.size())); formatLog("6. 逻辑操作符查询 Fenix"); - log.info("Fenix框架当前版本不支持复杂的嵌套OR和NOT组合逻辑"); - log.info("Fenix支持简单的orEquals,但不支持嵌套的or + not组合"); + log.info(""" + Fenix框架当前版本不支持复杂的嵌套OR和NOT组合逻辑 + Fenix支持简单的orEquals,但不支持嵌套的or + not组合"""); var result6_fenix = employeeRepository.findAll( builder -> builder.orEquals(Employee.Fields.name, "Alice") .orEquals(Employee.Fields.name, "Bob") @@ -498,14 +501,15 @@ public class TestApplication extends AbstractTestApplication { Assert.isTrue(result8_jpa.size() == 1, "Join 操作查询失败 (%d)".formatted(result8_jpa.size())); formatLog("8. Join 操作查询 Fenix"); - log.info("Fenix框架当前版本不支持显式的join操作:"); - log.info(" - root.join() - 显式关联查询"); - log.info(" - root.fetch() - 显式抓取查询"); - log.info(" - Map join (cb.equal(root.join().value(), ...))"); - log.info("Fenix主要用于单表条件查询,复杂join操作建议使用JPA Specification原生方式或QueryDSL"); - log.info("可以通过doAny使用原生CriteriaBuilder实现join操作"); - log.info("注意:由于类型系统的限制,doAny中使用join可能会有类型推断问题"); - log.info("建议:对于join等复杂查询,直接使用JPA Specification原生方式"); + log.info(""" + Fenix框架当前版本不支持显式的join操作: + - root.join() - 显式关联查询 + - root.fetch() - 显式抓取查询 + - Map join (cb.equal(root.join().value(), ...)) + Fenix主要用于单表条件查询,复杂join操作建议使用JPA Specification原生方式或QueryDSL + 可以通过doAny使用原生CriteriaBuilder实现join操作 + 注意:由于类型系统的限制,doAny中使用join可能会有类型推断问题 + 建议:对于join等复杂查询,直接使用JPA Specification原生方式"""); formatLog("8. Join 操作查询 QueryDSL"); var result8_querydsl = employeeRepository.findAll( @@ -565,13 +569,14 @@ public class TestApplication extends AbstractTestApplication { Assert.isTrue(result9_jpa.isEmpty(), "子查询(聚合函数)+ 数学运算失败 (%d)".formatted(result9_jpa.size())); formatLog("9. 子查询和聚合函数查询 Fenix"); - log.info("Fenix框架当前版本不支持以下高级查询特性:"); - log.info(" - query.subquery() - 子查询"); - log.info(" - cb.avg(), cb.count(), cb.sum() - 聚合函数"); - log.info(" - cb.coalesce() - 空值替换函数"); - log.info(" - cb.sum() - 数值加法运算"); - log.info("这些是SQL级别的复杂查询,Fenix主要用于动态条件构建"); - log.info("可以通过doAny使用原生CriteriaBuilder实现部分聚合操作"); + log.info(""" + Fenix框架当前版本不支持以下高级查询特性: + - query.subquery() - 子查询 + - cb.avg(), cb.count(), cb.sum() - 聚合函数 + - cb.coalesce() - 空值替换函数 + - cb.sum() - 数值加法运算 + 这些是SQL级别的复杂查询,Fenix主要用于动态条件构建 + 可以通过doAny使用原生CriteriaBuilder实现部分聚合操作"""); formatLog("9. 子查询和聚合函数查询 QueryDSL"); var avgQuery = factory.select(QEmployee.employee.salary.avg()); @@ -622,8 +627,9 @@ public class TestApplication extends AbstractTestApplication { Assert.isTrue(result10_jpa.size() == 3, "排序查询失败 (%d)".formatted(result10_jpa.size())); formatLog("10. 排序查询 Fenix"); - log.info("Fenix框架使用Spring Data JPA原生的Sort对象进行排序"); - log.info("Fenix构建查询条件,Sort对象通过repository.findAll()的第二个参数传入"); + log.info(""" + Fenix框架使用Spring Data JPA原生的Sort对象进行排序 + Fenix构建查询条件,Sort对象通过repository.findAll()的第二个参数传入"""); var result10_fenix = employeeRepository.findAll( builder -> builder.andEquals(Employee.Fields.active, true) .andNotEquals(Employee.Fields.role, Employee.Role.ADMIN) @@ -677,8 +683,9 @@ public class TestApplication extends AbstractTestApplication { Assert.isTrue(page11_jpa.getTotalElements() == 3, "总元素数不正确 (%d)".formatted(page11_jpa.getTotalElements())); formatLog("11. 分页查询 Fenix"); - log.info("Fenix框架使用Spring Data JPA原生的Pageable对象进行分页"); - log.info("Fenix构建查询条件,Pageable对象通过repository.findAll()的第二个参数传入"); + log.info(""" + Fenix框架使用Spring Data JPA原生的Pageable对象进行分页 + Fenix构建查询条件,Pageable对象通过repository.findAll()的第二个参数传入"""); var page11_fenix = employeeRepository.findAll( builder -> builder.andEquals(Employee.Fields.active, true) .andNotEquals(Employee.Fields.role, Employee.Role.ADMIN) @@ -691,10 +698,11 @@ public class TestApplication extends AbstractTestApplication { Assert.isTrue(page11_fenix.getTotalElements() == 3, "总元素数不正确 (%d)".formatted(page11_fenix.getTotalElements())); formatLog("11. 分页查询 QueryDSL"); - log.info("QueryDSL支持分页查询:"); - log.info(" - offset() - 跳过记录数"); - log.info(" - limit() - 限制记录数"); - log.info(" - 也可以结合Spring Data JPA的Pageable对象"); + log.info(""" + QueryDSL支持分页查询: + - offset() - 跳过记录数 + - limit() - 限制记录数 + - 也可以结合Spring Data JPA的Pageable对象"""); var page11_querydsl = employeeRepository.findAll( QEmployee.employee.active.isTrue() .and(QEmployee.employee.role.ne(Employee.Role.ADMIN)) @@ -751,14 +759,15 @@ public class TestApplication extends AbstractTestApplication { Assert.isTrue(result12_jpa.size() == 2, "CASE WHEN 查询失败 (%d)".formatted(result12_jpa.size())); formatLog("12. CASE WHEN 条件表达式查询 Fenix"); - log.info("Fenix框架当前版本不支持CASE WHEN条件表达式:"); - log.info(" - cb.selectCase() - SQL CASE WHEN表达式"); - log.info(" - .when() - CASE WHEN条件分支"); - log.info(" - .otherwise() - CASE ELSE分支"); - log.info("CASE WHEN是SQL级别的条件表达式,Fenix主要用于动态条件构建"); - log.info("可以通过doAny使用原生CriteriaBuilder实现CASE WHEN操作"); - log.info("注意:由于类型系统的限制,doAny中使用CriteriaBuilder的复杂表达式可能会有类型推断问题"); - log.info("建议:对于CASE WHEN等复杂查询,直接使用JPA Specification原生方式"); + log.info(""" + Fenix框架当前版本不支持CASE WHEN条件表达式: + - cb.selectCase() - SQL CASE WHEN表达式 + - .when() - CASE WHEN条件分支 + - .otherwise() - CASE ELSE分支 + CASE WHEN是SQL级别的条件表达式,Fenix主要用于动态条件构建 + 可以通过doAny使用原生CriteriaBuilder实现CASE WHEN操作 + 注意:由于类型系统的限制,doAny中使用CriteriaBuilder的复杂表达式可能会有类型推断问题 + 建议:对于CASE WHEN等复杂查询,直接使用JPA Specification原生方式"""); var result12_fenix = employeeRepository.findAll(builder -> { return builder.doAny(null, null, (cb, root, fieldName, value) -> { // 使用原生JPA Criteria实现CASE WHEN(简化版本) @@ -833,13 +842,14 @@ public class TestApplication extends AbstractTestApplication { Assert.isTrue(result13_jpa.size() == 1 && result13_jpa.get(0).getName().equals("Alice"), "综合多条件查询失败 (%d)".formatted(result13_jpa.size())); formatLog("13. 综合多条件查询 Fenix"); - log.info("Fenix框架不支持综合多条件查询中的复杂join和集合操作:"); - log.info(" - 显式join操作(company, skills, properties)"); - log.info(" - 集合isEmpty/isNotEmpty/isMember操作"); - log.info(" - Map join操作"); - log.info(" - 嵌入式对象查询(address.city)"); - log.info("Fenix主要支持简单的单表字段查询"); - log.info("可以通过doAny使用原生CriteriaBuilder实现复杂综合查询"); + log.info(""" + Fenix框架不支持综合多条件查询中的复杂join和集合操作: + - 显式join操作(company, skills, properties) + - 集合isEmpty/isNotEmpty/isMember操作 + - Map join操作 + - 嵌入式对象查询(address.city) + Fenix主要支持简单的单表字段查询 + 可以通过doAny使用原生CriteriaBuilder实现复杂综合查询"""); formatLog("13. 综合多条件查询 QueryDSL"); var result13_querydsl = employeeRepository.findAll(