【发布时间】:2023-03-12 04:16:02
【问题描述】:
我在 Java 1.8 中使用 Spring Boot (1.5.14.RELEASE) 和 Spring data Jpa。我想避免重复代码。
以下查询获取员工详细信息。它工作正常。
Class EmployeeDAO:
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<EmployeeDto> cq = cb.createQuery(EmployeeDto.class);
Root<EmployeeInfo> root = cq.from(EmployeeInfo.class);
Join<EmployeeInfo, SalaryInfo> SalaryType = root.join("SalaryInfo");
Join<EmployeeInfo, CompanyInfo> Company = root.join("CompanyInfo");
cq.select(cb.construct(EmployeeDto.class,
root.get("FirstName"),
SalaryType.get("Salary"),
Company.get("CompanyName")))
.where(specification.toPredicate(root, cq, cb))
.orderBy(cb.asc(root.get("FirstName")));
同一类中的另一个函数也进行了几乎 90% 相同的标准构建器查询,如下所示:
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<EmployeeDto> cq = cb.createQuery(EmployeeDto.class);
Root<EmployeeInfo> root = cq.from(EmployeeInfo.class);
Join<EmployeeInfo, SalaryInfo> SalaryType = root.join("SalaryInfo");
Join<EmployeeInfo, CompanyInfo> Company = root.join("CompanyInfo");
Join<EmployeeInfo, UserInfo> User = root.join("UserInfo");
cq.select(cb.construct(EmployeeDto.class,
root.get("FirstName"),
SalaryType.get("Salary"),
Company.get("CompanyName"),
User.get("Age")))
.where(specification.toPredicate(root, cq, cb))
.orderBy(cb.asc(root.get("FirstName")));
两个函数中的代码是相同的,只是下面的代码是与 UserInfo 表进行连接以获取用户年龄。所有其他代码都是重复的。你能告诉我如何避免这个重复的代码。
【问题讨论】:
-
我想做的是制作一个应该包含通用代码的通用函数。上面两个代码块都应该调用这个函数来获取公共代码,然后在需要时添加进一步的连接。
-
为什么不使用
spring-data-jpa存储库或querydsl来生成谓词?
标签: spring spring-boot