使用CriteriaBuilder向下转换java JPA标准API。treat()方法
实体
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@Entity
@DiscriminatorColumn(name = "EMP_TYPE")
public class Employee {
@Id
@GeneratedValue
private long id;
private String name;
.............
}
@Entity
@DiscriminatorValue("F")
public class FullTimeEmployee extends Employee {
private int annualSalary;
.............
}
@Entity
@DiscriminatorValue("P")
public class PartTimeEmployee extends Employee {
private int weeklySalary;
.............
}
查询:
public Page<Employee> query(Pageable page) {
Specification<Employee> specification = (root, query, criteriaBuilder) -> {
List<Predicate> predicates = new ArrayList<>();
Predicate predicate1 = criteriaBuilder.equal(root.get("name"), "test");
Root<PartTimeEmployee> PartTimeEmployeeRoot = criteriaBuilder.treat(root, PartTimeEmployee.class);
Predicate predicate2 = criteriaBuilder.equal(PartTimeEmployeeRoot.get("weeklySalary"), 100);
predicates.add(criteriaBuilder.or(predicate1, predicate2));
return criteriaBuilder.and(predicates.toArray(new Predicate[0]));
};
return employeeRepository.findAll(specification, page);
}
SQL是
在哪里 雇员。type='P' 及( 雇员。姓名=? 或雇员。周薪=100 )
我所期望的是:
在哪里 及( 雇员。姓名=? 或(雇员0.type='C'和雇员0.hourl费率<;75) )
共 (0) 个答案