test: 增加联表查询的示例
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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<Report, ReportController.SaveItem, ReportController.ListItem, ReportController.DetailItem> {
|
||||
private final EmployeeService employeeService;
|
||||
|
||||
public ReportController(ReportService service, EmployeeService employeeService) {
|
||||
super(service);
|
||||
this.employeeService = employeeService;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Function<SaveItem, Report> 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<Report, ListItem> 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<Report, DetailItem> 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;
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
@@ -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<Report, Long> {
|
||||
}
|
||||
@@ -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<Report> {
|
||||
public ReportService(ReportRepository repository) {
|
||||
super(repository);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user