1
0

feat: 引入lombok、querydsl

This commit is contained in:
2025-08-15 16:57:58 +08:00
parent 2469c1bcf3
commit 6e2629a8b5
16 changed files with 311 additions and 545 deletions

View File

@@ -111,6 +111,19 @@ public class TestApplication {
log.info(listItems("company").toPrettyString());
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 employees = listItems("employee");
Assert.isTrue(employees.at("/data/items").size() == 3, "数量错误");
Assert.isTrue(employees.at("/data/total").asLong() == 3, "返回数量错误");
var employee1 = detailItem("employee", eid1);
Assert.isTrue(eid1 == employee1.at("/data/id").asLong(), "id错误");
Assert.isTrue("Tom".equals(employee1.at("/data/name").asText()), "name错误");
Assert.isTrue(18 == employee1.at("/data/age").asInt(), "age错误");
System.exit(0);
}

View File

@@ -3,13 +3,14 @@ package com.lanyuanxiaoyao.service.template.controller;
import com.lanyuanxiaoyao.service.template.entity.Company;
import com.lanyuanxiaoyao.service.template.service.CompanyService;
import java.time.LocalDateTime;
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;
/**
* @author lanyuanxiaoyao
* @version 20250814
*/
@RestController
@RequestMapping("company")
public class CompanyController extends SimpleControllerSupport<Company, CompanyController.SaveItem, CompanyController.ListItem, CompanyController.DetailItem> {
@@ -30,162 +31,56 @@ public class CompanyController extends SimpleControllerSupport<Company, CompanyC
@Override
protected ListItemMapper<Company, ListItem> listItemMapper() {
return company -> {
var item = new ListItem();
item.setId(company.getId());
item.setName(company.getName());
item.setMembers(company.getMembers());
return item;
};
return company -> new ListItem(
company.getId(),
company.getName(),
company.getMembers()
);
}
@Override
protected DetailItemMapper<Company, DetailItem> detailItemMapper() {
return company -> {
var item = new DetailItem();
item.setId(company.getId());
item.setName(company.getName());
item.setMembers(company.getMembers());
item.setCreatedTime(company.getCreatedTime());
item.setModifiedTime(company.getModifiedTime());
return item;
};
return company -> new DetailItem(
company.getId(),
company.getName(),
company.getMembers(),
company.getCreatedTime(),
company.getModifiedTime()
);
}
@Setter
@Getter
@ToString
@AllArgsConstructor
@NoArgsConstructor
public static class SaveItem {
private Long id;
private String name;
private Integer members;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getMembers() {
return members;
}
public void setMembers(Integer members) {
this.members = members;
}
@Override
public String toString() {
return "SaveItem{" +
"id=" + id +
", name='" + name + '\'' +
", members=" + members +
'}';
}
}
@Setter
@Getter
@ToString
@AllArgsConstructor
@NoArgsConstructor
public static class ListItem {
private Long id;
private String name;
private Integer members;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getMembers() {
return members;
}
public void setMembers(Integer members) {
this.members = members;
}
@Override
public String toString() {
return "ListItem{" +
"id=" + id +
", name='" + name + '\'' +
", members=" + members +
'}';
}
}
@Setter
@Getter
@ToString
@AllArgsConstructor
@NoArgsConstructor
public static class DetailItem {
private Long id;
private String name;
private Integer members;
private LocalDateTime createdTime;
private LocalDateTime modifiedTime;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getMembers() {
return members;
}
public void setMembers(Integer members) {
this.members = members;
}
public LocalDateTime getCreatedTime() {
return createdTime;
}
public void setCreatedTime(LocalDateTime createdTime) {
this.createdTime = createdTime;
}
public LocalDateTime getModifiedTime() {
return modifiedTime;
}
public void setModifiedTime(LocalDateTime modifiedTime) {
this.modifiedTime = modifiedTime;
}
@Override
public String toString() {
return "DetailItem{" +
"id=" + id +
", name='" + name + '\'' +
", members=" + members +
", createdTime=" + createdTime +
", modifiedTime=" + modifiedTime +
'}';
}
}
}

View File

@@ -0,0 +1,99 @@
package com.lanyuanxiaoyao.service.template.controller;
import com.lanyuanxiaoyao.service.template.entity.Employee;
import com.lanyuanxiaoyao.service.template.service.CompanyService;
import com.lanyuanxiaoyao.service.template.service.EmployeeService;
import java.time.LocalDateTime;
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("employee")
public class EmployeeController extends SimpleControllerSupport<Employee, EmployeeController.SaveItem, EmployeeController.ListItem, EmployeeController.DetailItem> {
private final CompanyService companyService;
public EmployeeController(EmployeeService service, CompanyService companyService) {
super(service);
this.companyService = companyService;
}
@Override
protected SaveItemMapper<Employee, SaveItem> saveItemMapper() {
return item -> {
var employee = new Employee();
employee.setId(item.getId());
employee.setName(item.getName());
employee.setAge(item.getAge());
employee.setRole(Employee.Role.USER);
employee.setCompany(companyService.detailOrThrow(item.getCompanyId()));
return employee;
};
}
@Override
protected ListItemMapper<Employee, ListItem> listItemMapper() {
return employee -> new ListItem(
employee.getId(),
employee.getName(),
employee.getAge(),
employee.getRole()
);
}
@Override
protected DetailItemMapper<Employee, DetailItem> detailItemMapper() {
return employee -> new DetailItem(
employee.getId(),
employee.getCompany().getId(),
employee.getName(),
employee.getAge(),
employee.getRole(),
employee.getCreatedTime(),
employee.getModifiedTime()
);
}
@Setter
@Getter
@ToString
@AllArgsConstructor
@NoArgsConstructor
public static class SaveItem {
private Long id;
private Long companyId;
private String name;
private Integer age;
}
@Setter
@Getter
@ToString
@AllArgsConstructor
@NoArgsConstructor
public static class ListItem {
private Long id;
private String name;
private Integer age;
private Employee.Role role;
}
@Setter
@Getter
@ToString
@AllArgsConstructor
@NoArgsConstructor
public static class DetailItem {
private Long id;
private Long companyId;
private String name;
private Integer age;
private Employee.Role role;
private LocalDateTime createdTime;
private LocalDateTime modifiedTime;
}
}

View File

@@ -1,42 +1,33 @@
package com.lanyuanxiaoyao.service.template.entity;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.EntityListeners;
import jakarta.persistence.OneToMany;
import java.util.Set;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import org.hibernate.annotations.Comment;
import org.hibernate.annotations.DynamicUpdate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
@Setter
@Getter
@ToString(callSuper = true)
@Entity
@DynamicUpdate
@EntityListeners(AuditingEntityListener.class)
@Comment("企业")
public class Company extends SimpleEntity {
@Column(nullable = false)
@Comment("名称")
private String name;
@Column(nullable = false)
@Comment("成员数")
private Integer members;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getMembers() {
return members;
}
public void setMembers(Integer members) {
this.members = members;
}
@Override
public String toString() {
return "Company{" +
"name='" + name + '\'' +
", members=" + members +
"} " + super.toString();
}
@OneToMany(mappedBy = "company")
@ToString.Exclude
private Set<Employee> employees;
}

View File

@@ -0,0 +1,53 @@
package com.lanyuanxiaoyao.service.template.entity;
import jakarta.persistence.Column;
import jakarta.persistence.ConstraintMode;
import jakarta.persistence.Entity;
import jakarta.persistence.EntityListeners;
import jakarta.persistence.EnumType;
import jakarta.persistence.Enumerated;
import jakarta.persistence.FetchType;
import jakarta.persistence.ForeignKey;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.NamedAttributeNode;
import jakarta.persistence.NamedEntityGraph;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import org.hibernate.annotations.Comment;
import org.hibernate.annotations.DynamicUpdate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
@Setter
@Getter
@ToString(callSuper = true)
@Entity
@DynamicUpdate
@EntityListeners(AuditingEntityListener.class)
@NamedEntityGraph(name = "employee.detail", attributeNodes = {
@NamedAttributeNode("company")
})
@Comment("员工")
public class Employee extends SimpleEntity {
@Column(nullable = false)
@Comment("名称")
private String name;
@Column(nullable = false)
@Comment("年龄")
private Integer age;
@Column(nullable = false)
@Enumerated(EnumType.STRING)
@Comment("角色")
private Role role;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(nullable = false, foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT))
@ToString.Exclude
private Company company;
public enum Role {
USER,
ADMIN,
}
}

View File

@@ -3,10 +3,6 @@ package com.lanyuanxiaoyao.service.template.repository;
import com.lanyuanxiaoyao.service.template.entity.Company;
import org.springframework.stereotype.Repository;
/**
* @author lanyuanxiaoyao
* @version 20250814
*/
@Repository
public interface CompanyRepository extends SimpleRepository<Company, Long> {
}

View File

@@ -0,0 +1,15 @@
package com.lanyuanxiaoyao.service.template.repository;
import com.lanyuanxiaoyao.service.template.entity.Employee;
import java.util.Optional;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.data.jpa.repository.EntityGraph;
import org.springframework.stereotype.Repository;
@SuppressWarnings("NullableProblems")
@Repository
public interface EmployeeRepository extends SimpleRepository<Employee, Long> {
@EntityGraph(value = "employee.detail", type = EntityGraph.EntityGraphType.FETCH)
@Override
Optional<Employee> findOne(Specification<Employee> specification);
}

View File

@@ -4,17 +4,9 @@ import com.lanyuanxiaoyao.service.template.entity.Company;
import com.lanyuanxiaoyao.service.template.repository.CompanyRepository;
import org.springframework.stereotype.Service;
/**
* @author lanyuanxiaoyao
* @version 20250814
*/
@Service
public class CompanyService extends SimpleServiceSupport<Company> {
public CompanyService(CompanyRepository repository) {
super(repository);
}
public void test() {
}
}

View File

@@ -0,0 +1,12 @@
package com.lanyuanxiaoyao.service.template.service;
import com.lanyuanxiaoyao.service.template.entity.Employee;
import com.lanyuanxiaoyao.service.template.repository.EmployeeRepository;
import org.springframework.stereotype.Service;
@Service
public class EmployeeService extends SimpleServiceSupport<Employee> {
public EmployeeService(EmployeeRepository repository) {
super(repository);
}
}