diff --git a/src/test/java/com/lanyuanxiaoyao/service/template/TestApplication.java b/src/test/java/com/lanyuanxiaoyao/service/template/TestApplication.java index 18eb79f..0f6970e 100644 --- a/src/test/java/com/lanyuanxiaoyao/service/template/TestApplication.java +++ b/src/test/java/com/lanyuanxiaoyao/service/template/TestApplication.java @@ -4,6 +4,15 @@ import com.blinkfox.fenix.EnableFenix; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; +import com.lanyuanxiaoyao.service.template.entity.Company_; +import com.lanyuanxiaoyao.service.template.entity.Employee; +import com.lanyuanxiaoyao.service.template.entity.Employee_; +import com.lanyuanxiaoyao.service.template.entity.QEmployee; +import com.lanyuanxiaoyao.service.template.entity.Report; +import com.lanyuanxiaoyao.service.template.entity.Report_; +import com.lanyuanxiaoyao.service.template.repository.EmployeeRepository; +import jakarta.annotation.Resource; +import java.util.List; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.SpringApplication; @@ -29,6 +38,8 @@ public class TestApplication { private static final String BASE_URL = "http://localhost:2490"; private static final RestTemplate REST_CLIENT = new RestTemplate(); private static final ObjectMapper MAPPER = new ObjectMapper(); + @Resource + private EmployeeRepository employeeRepository; public static void main(String[] args) { SpringApplication.run(TestApplication.class, args); @@ -80,7 +91,8 @@ public class TestApplication { " \"members\": 50\n" + " },\n" + " \"greatEqual\": {\n" + - " \"members\": 0\n" + + " \"members\": 0,\n" + + " \"createdTime\": \"2025-01-01 00:00:00\"\n" + " },\n" + " \"in\": {\n" + " \"name\": [\n" + @@ -136,6 +148,86 @@ public class TestApplication { System.exit(0); } + @EventListener(ApplicationReadyEvent.class) + public void runSpecificationTests() throws JsonProcessingException { + // 增 + var cid1 = saveItem("company", "{\"name\": \"Apple\",\"members\": 10}").get("data").asLong(); + var cid2 = saveItem("company", "{\"name\": \"Banana\",\"members\": 20}").get("data").asLong(); + var cid3 = saveItem("company", "{\"name\": \"Cheery\",\"members\": 20}").get("data").asLong(); + var eid1 = saveItem("employee", "{\"name\": \"Tom\",\"age\": 18, \"companyId\": %d}".formatted(cid1)).get("data").asLong(); + var eid2 = saveItem("employee", "{\"name\": \"Jerry\",\"age\": 18, \"companyId\": %d}".formatted(cid1)).get("data").asLong(); + var eid3 = saveItem("employee", "{\"name\": \"Mike\",\"age\": 18, \"companyId\": %d}".formatted(cid2)).get("data").asLong(); + var rid = saveItem("report", "{\"employeeId\": %d, \"score\": 56.38, \"level\": \"A\"}".formatted(eid1)).get("data").asLong(); + var rid2 = saveItem("report", "{\"employeeId\": %d, \"score\": 78.98, \"level\": \"B\"}".formatted(eid2)).get("data").asLong(); + + log.debug( + "Results: {}", + employeeRepository.findAll( + builder -> builder + .andIsNotNull(Employee.Fields.name) + .andEquals(Employee.Fields.name, "Tom") + .andLike(Employee.Fields.name, "To%") + .andStartsWith(Employee.Fields.name, "To") + .andEndsWith(Employee.Fields.name, "om") + .andLessThan(Employee.Fields.age, 50) + .andGreaterThanEqual(Employee.Fields.age, 0) + .andIn(Employee.Fields.name, List.of("Tom", "Mike")) + .andBetween(Employee.Fields.age, 0, 50) + .build() + ) + ); + + log.debug( + "Results: {}", + employeeRepository.findAll( + (root, query, builder) -> + builder.and( + builder.isNotNull(root.get(Employee_.name)), + builder.equal(root.get(Employee_.name), "Tom"), + builder.like(root.get(Employee_.name), "To%"), + builder.lessThan(root.get(Employee_.age), 50), + builder.greaterThanOrEqualTo(root.get(Employee_.age), 0), + builder.in(root.get(Employee_.NAME)).value(List.of("Tom", "Mike")), + builder.between(root.get(Employee_.age), 0, 50), + builder.isNotEmpty(root.get(Employee_.company).get(Company_.employees)), + builder.notEqual(root.get(Employee_.company).get(Company_.name), "Apple") + ) + ) + ); + + log.debug( + "Results: {}", + employeeRepository.findAll( + QEmployee.employee.name.isNotNull() + .and(QEmployee.employee.name.eq("Tom")) + .and(QEmployee.employee.name.like("To%")) + .and(QEmployee.employee.name.startsWith("To")) + .and(QEmployee.employee.name.endsWith("om")) + .and(QEmployee.employee.age.lt(50)) + .and(QEmployee.employee.age.goe(0)) + .and(QEmployee.employee.name.in("Tom", "Mike")) + .and(QEmployee.employee.age.between(0, 50)) + .and(QEmployee.employee.company().employees.isNotEmpty()) + .and(QEmployee.employee.company().employees.any().name.ne("Tom")) + ) + ); + + log.debug( + "Results: {}", + employeeRepository.findAll( + (root, query, builder) -> { + var reportRoot = query.from(Report.class); + return builder.and( + builder.equal(root.get(Employee_.id), reportRoot.get(Report_.employeeId)), + builder.equal(reportRoot.get(Report_.level), Report.Level.A) + ); + } + ) + ); + + System.exit(0); + } + private HttpHeaders headers() { var headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); diff --git a/src/test/java/com/lanyuanxiaoyao/service/template/controller/ReportController.java b/src/test/java/com/lanyuanxiaoyao/service/template/controller/ReportController.java new file mode 100644 index 0000000..8d1fb14 --- /dev/null +++ b/src/test/java/com/lanyuanxiaoyao/service/template/controller/ReportController.java @@ -0,0 +1,107 @@ +package com.lanyuanxiaoyao.service.template.controller; + +import com.lanyuanxiaoyao.service.template.entity.Report; +import com.lanyuanxiaoyao.service.template.service.EmployeeService; +import com.lanyuanxiaoyao.service.template.service.ReportService; +import java.time.LocalDateTime; +import java.util.function.Function; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("report") +public class ReportController extends SimpleControllerSupport { + private final EmployeeService employeeService; + + public ReportController(ReportService service, EmployeeService employeeService) { + super(service); + this.employeeService = employeeService; + } + + @Override + protected Function saveItemMapper() { + return item -> { + var report = new Report(); + report.setId(item.getId()); + report.setScore(item.getScore()); + report.setLevel(item.getLevel()); + report.setEmployeeId(item.getEmployeeId()); + return report; + }; + } + + @Override + protected Function listItemMapper() { + return report -> { + var employee = employeeService.detailOrThrow(report.getEmployeeId()); + return new ListItem( + report.getId(), + employee.getId(), + employee.getName(), + report.getScore(), + report.getLevel() + ); + }; + } + + @Override + protected Function detailItemMapper() { + return report -> { + var employee = employeeService.detailOrThrow(report.getEmployeeId()); + return new DetailItem( + report.getId(), + employee.getId(), + employee.getName(), + report.getScore(), + report.getLevel(), + report.getCreatedTime(), + report.getModifiedTime() + ); + }; + } + + @Setter + @Getter + @ToString + @AllArgsConstructor + @NoArgsConstructor + public static class SaveItem { + private Long id; + private Double score; + private Report.Level level; + private Long employeeId; + } + + @Setter + @Getter + @ToString + @AllArgsConstructor + @NoArgsConstructor + public static class ListItem { + private Long id; + private Long employeeId; + private String employeeName; + private Double score; + private Report.Level level; + } + + @Setter + @Getter + @ToString + @AllArgsConstructor + @NoArgsConstructor + public static class DetailItem { + private Long id; + private Long employeeId; + private String employeeName; + private Double score; + private Report.Level level; + private LocalDateTime createdTime; + private LocalDateTime modifiedTime; + } +} diff --git a/src/test/java/com/lanyuanxiaoyao/service/template/entity/Report.java b/src/test/java/com/lanyuanxiaoyao/service/template/entity/Report.java new file mode 100644 index 0000000..50a7c50 --- /dev/null +++ b/src/test/java/com/lanyuanxiaoyao/service/template/entity/Report.java @@ -0,0 +1,40 @@ +package com.lanyuanxiaoyao.service.template.entity; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.EntityListeners; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; +import lombok.experimental.FieldNameConstants; +import org.hibernate.annotations.Comment; +import org.hibernate.annotations.DynamicUpdate; +import org.springframework.data.jpa.domain.support.AuditingEntityListener; + +@Setter +@Getter +@ToString(callSuper = true) +@FieldNameConstants +@Entity +@DynamicUpdate +@EntityListeners(AuditingEntityListener.class) +@Comment("报告") +public class Report extends SimpleEntity { + @Column(nullable = false) + @Comment("分数") + private Double score = 0.0; + @Column(nullable = false) + @Enumerated(EnumType.STRING) + @Comment("等级") + private Level level; + + @Column(nullable = false) + @Comment("员工id") + private Long employeeId; + + public enum Level { + A, B, C, D, E + } +} diff --git a/src/test/java/com/lanyuanxiaoyao/service/template/repository/ReportRepository.java b/src/test/java/com/lanyuanxiaoyao/service/template/repository/ReportRepository.java new file mode 100644 index 0000000..91543e7 --- /dev/null +++ b/src/test/java/com/lanyuanxiaoyao/service/template/repository/ReportRepository.java @@ -0,0 +1,8 @@ +package com.lanyuanxiaoyao.service.template.repository; + +import com.lanyuanxiaoyao.service.template.entity.Report; +import org.springframework.stereotype.Repository; + +@Repository +public interface ReportRepository extends SimpleRepository { +} diff --git a/src/test/java/com/lanyuanxiaoyao/service/template/service/ReportService.java b/src/test/java/com/lanyuanxiaoyao/service/template/service/ReportService.java new file mode 100644 index 0000000..7b59387 --- /dev/null +++ b/src/test/java/com/lanyuanxiaoyao/service/template/service/ReportService.java @@ -0,0 +1,12 @@ +package com.lanyuanxiaoyao.service.template.service; + +import com.lanyuanxiaoyao.service.template.entity.Report; +import com.lanyuanxiaoyao.service.template.repository.ReportRepository; +import org.springframework.stereotype.Service; + +@Service +public class ReportService extends SimpleServiceSupport { + public ReportService(ReportRepository repository) { + super(repository); + } +}