避免spring数据jpa中的criteria builder查询中的重复代码
我在Java1.8中使用SpringBoot(1.5.14.RELEASE)和SpringDataJPA。我想避免重复代码 下面的查询获取员工详细信息。很好用 班级员工DAO:避免spring数据jpa中的criteria builder查询中的重复代码,spring,spring-boot,Spring,Spring Boot,我在Java1.8中使用SpringBoot(1.5.14.RELEASE)和SpringDataJPA。我想避免重复代码 下面的查询获取员工详细信息。很好用 班级员工DAO: CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery<EmployeeDto> cq = cb.createQuery(EmployeeDto.class); Root<EmployeeInfo> root = cq.f
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")));
CriteriaBuilder cb=em.getCriteriaBuilder();
CriteriaQuery cq=cb.createQuery(EmployeeDto.class);
Root=cq.from(EmployeeInfo.class);
Join-SalaryType=root.Join(“SalaryInfo”);
Join Company=root.Join(“CompanyInfo”);
cq.选择(cb.构造(EmployeeDto.class、,
root.get(“FirstName”),
SalaryType.get(“薪水”),
Company.get(“CompanyName”))
.where(规范toPredicate(根、cq、cb))
.orderBy(cb.asc(root.get(“FirstName”));
同一类中的另一个函数也可以进行几乎90%相同的criteria builder查询,如下所示:
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")));
CriteriaBuilder cb=em.getCriteriaBuilder();
CriteriaQuery cq=cb.createQuery(EmployeeDto.class);
Root=cq.from(EmployeeInfo.class);
Join-SalaryType=root.Join(“SalaryInfo”);
Join Company=root.Join(“CompanyInfo”);
Join User=root.Join(“UserInfo”);
cq.选择(cb.构造(EmployeeDto.class、,
root.get(“FirstName”),
SalaryType.get(“薪水”),
Company.get(“CompanyName”),
User.get(“年龄”))
.where(规范toPredicate(根、cq、cb))
.orderBy(cb.asc(root.get(“FirstName”));
这两个函数中的代码都是相同的,只是下面的代码正在与UserInfo表进行连接以获取用户年龄。所有其他代码都是重复的。您能告诉我如何避免重复的代码吗。类似这样的内容:
public class EmployeeDAO {
EntityManager em;
Specification specification;
public void get(boolean withUsers) {
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");
List<Selection> sels = new ArrayList<>();
Collections.addAll(sels,
root.get("FirstName"),
salaryType.get("Salary"),
company.get("CompanyName")
);
if (withUsers) {
Join<EmployeeInfo, UserInfo> user = root.join("UserInfo");
sels.add(user.get("Age"));
}
cq.select(cb.construct(EmployeeDto.class,
sels.toArray(new Selection[0])
))
.where(specification.toPredicate(root, cq, cb))
.orderBy(cb.asc(root.get("FirstName")));
}
public class EmployeeDAO{
实体管理器;
规格说明;
公共void get(带用户的布尔值){
CriteriaBuilder cb=em.getCriteriaBuilder();
CriteriaQuery cq=cb.createQuery(EmployeeDto.class);
Root=cq.from(EmployeeInfo.class);
Join-salaryType=root.Join(“SalaryInfo”);
Join company=root.Join(“CompanyInfo”);
List sels=new ArrayList();
集合。添加所有(sels,
root.get(“FirstName”),
salaryType.get(“薪水”),
company.get(“CompanyName”)
);
如果(与用户一起){
Join user=root.Join(“UserInfo”);
sels.add(user.get(“年龄”));
}
cq.选择(cb.构造(EmployeeDto.class、,
选择toArray(新选择[0])
))
.where(规范toPredicate(根、cq、cb))
.orderBy(cb.asc(root.get(“FirstName”));
}
}类似这样的内容:
public class EmployeeDAO {
EntityManager em;
Specification specification;
public void get(boolean withUsers) {
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");
List<Selection> sels = new ArrayList<>();
Collections.addAll(sels,
root.get("FirstName"),
salaryType.get("Salary"),
company.get("CompanyName")
);
if (withUsers) {
Join<EmployeeInfo, UserInfo> user = root.join("UserInfo");
sels.add(user.get("Age"));
}
cq.select(cb.construct(EmployeeDto.class,
sels.toArray(new Selection[0])
))
.where(specification.toPredicate(root, cq, cb))
.orderBy(cb.asc(root.get("FirstName")));
}
public class EmployeeDAO{
实体管理器;
规格说明;
公共void get(带用户的布尔值){
CriteriaBuilder cb=em.getCriteriaBuilder();
CriteriaQuery cq=cb.createQuery(EmployeeDto.class);
Root=cq.from(EmployeeInfo.class);
Join-salaryType=root.Join(“SalaryInfo”);
Join company=root.Join(“CompanyInfo”);
List sels=new ArrayList();
集合。添加所有(sels,
root.get(“FirstName”),
salaryType.get(“薪水”),
company.get(“CompanyName”)
);
如果(与用户一起){
Join user=root.Join(“UserInfo”);
sels.add(user.get(“年龄”));
}
cq.选择(cb.构造(EmployeeDto.class、,
选择toArray(新选择[0])
))
.where(规范toPredicate(根、cq、cb))
.orderBy(cb.asc(root.get(“FirstName”));
}
}我想做的是创建一个应该包含公共代码的通用函数。上述两个代码块都应该调用此函数以获取公共代码,然后在需要时添加进一步的联接。为什么不使用
spring data jpa
存储库或querydsl
生成谓词?我想做的是生成一个应包含公共代码的通用函数。上述两个代码块都应该调用此函数来获取公共代码,然后在需要时添加进一步的联接。为什么不使用spring-data-jpa
存储库或querydsl
来生成谓词?