From 2615fc02fd0b84fdbd76b32972eca36d8cfd1540 Mon Sep 17 00:00:00 2001 From: lanyuanxiaoyao Date: Fri, 19 Sep 2025 17:41:02 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=E6=9C=AC=E5=9C=B0?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E7=A4=BA=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/template/TestApplication.java | 18 ++++++++++++++++++ .../service/template/entity/Employee.java | 5 ----- .../entity/vo/EmployeeWithCompanyName.java | 11 +++++++++++ .../repository/EmployeeRepository.java | 12 +++++++++++- 4 files changed, 40 insertions(+), 6 deletions(-) create mode 100644 src/test/java/com/lanyuanxiaoyao/service/template/entity/vo/EmployeeWithCompanyName.java diff --git a/src/test/java/com/lanyuanxiaoyao/service/template/TestApplication.java b/src/test/java/com/lanyuanxiaoyao/service/template/TestApplication.java index d534869..393931e 100644 --- a/src/test/java/com/lanyuanxiaoyao/service/template/TestApplication.java +++ b/src/test/java/com/lanyuanxiaoyao/service/template/TestApplication.java @@ -231,6 +231,24 @@ public class TestApplication { System.exit(0); } + @EventListener(ApplicationReadyEvent.class) + public void runNativeQueryTests() 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 list = employeeRepository.findAllEmployeeWithCompanyName(); + Assert.isTrue(list.size() == 3, "数量错误"); + log.debug("Results: {}", list); + var list_native = employeeRepository.findAllEmployeeWithCompanyNameNative(); + Assert.isTrue(list_native.size() == 3, "数量错误"); + log.debug("Results: {}", list_native); + } + private HttpHeaders headers() { var headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); diff --git a/src/test/java/com/lanyuanxiaoyao/service/template/entity/Employee.java b/src/test/java/com/lanyuanxiaoyao/service/template/entity/Employee.java index 7f4bc4c..fe509e4 100644 --- a/src/test/java/com/lanyuanxiaoyao/service/template/entity/Employee.java +++ b/src/test/java/com/lanyuanxiaoyao/service/template/entity/Employee.java @@ -12,8 +12,6 @@ import jakarta.persistence.JoinColumn; import jakarta.persistence.JoinTable; import jakarta.persistence.ManyToOne; import jakarta.persistence.MapKeyEnumerated; -import jakarta.persistence.NamedAttributeNode; -import jakarta.persistence.NamedEntityGraph; import java.util.HashMap; import java.util.Map; import lombok.Getter; @@ -35,9 +33,6 @@ import org.springframework.data.jpa.domain.support.AuditingEntityListener; @DynamicUpdate @DynamicInsert @EntityListeners(AuditingEntityListener.class) -@NamedEntityGraph(name = "employee.detail", attributeNodes = { - @NamedAttributeNode("company") -}) @Comment("员工") public class Employee extends SimpleEntity { @Column(nullable = false) diff --git a/src/test/java/com/lanyuanxiaoyao/service/template/entity/vo/EmployeeWithCompanyName.java b/src/test/java/com/lanyuanxiaoyao/service/template/entity/vo/EmployeeWithCompanyName.java new file mode 100644 index 0000000..cae70d1 --- /dev/null +++ b/src/test/java/com/lanyuanxiaoyao/service/template/entity/vo/EmployeeWithCompanyName.java @@ -0,0 +1,11 @@ +package com.lanyuanxiaoyao.service.template.entity.vo; + +import com.lanyuanxiaoyao.service.template.entity.Employee; + +public record EmployeeWithCompanyName( + String name, + String companyName, + Integer age, + Employee.Role role +) { +} diff --git a/src/test/java/com/lanyuanxiaoyao/service/template/repository/EmployeeRepository.java b/src/test/java/com/lanyuanxiaoyao/service/template/repository/EmployeeRepository.java index 151f4f6..59be417 100644 --- a/src/test/java/com/lanyuanxiaoyao/service/template/repository/EmployeeRepository.java +++ b/src/test/java/com/lanyuanxiaoyao/service/template/repository/EmployeeRepository.java @@ -1,15 +1,25 @@ package com.lanyuanxiaoyao.service.template.repository; import com.lanyuanxiaoyao.service.template.entity.Employee; +import com.lanyuanxiaoyao.service.template.entity.vo.EmployeeWithCompanyName; +import java.util.List; +import java.util.Map; import java.util.Optional; import org.springframework.data.jpa.domain.Specification; import org.springframework.data.jpa.repository.EntityGraph; +import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Repository; @SuppressWarnings("NullableProblems") @Repository public interface EmployeeRepository extends SimpleRepository { - @EntityGraph(value = "employee.detail", type = EntityGraph.EntityGraphType.FETCH) + @EntityGraph(attributePaths = {"company"}) @Override Optional findOne(Specification specification); + + @Query(value = "select e.name, c.name, e.age, e.role from employee e, company c where e.company_id = c.id", nativeQuery = true) + List> findAllEmployeeWithCompanyNameNative(); + + @Query("select new com.lanyuanxiaoyao.service.template.entity.vo.EmployeeWithCompanyName(employee.name, employee.company.name, employee.age, employee.role) from Employee employee") + List findAllEmployeeWithCompanyName(); }