Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
避免spring数据jpa中的criteria builder查询中的重复代码_Spring_Spring Boot - Fatal编程技术网

避免spring数据jpa中的criteria builder查询中的重复代码

避免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

我在Java1.8中使用SpringBoot(1.5.14.RELEASE)和SpringDataJPA。我想避免重复代码

下面的查询获取员工详细信息。很好用

班级员工DAO:

  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
来生成谓词?