0

我对 JPA 中的过滤条件有疑问,是否可以仅为过滤条件调用另一个实体类

我有一个被调用的方法,当加载 JSF 页面时,它将在 ManagedBeans 中调用EmployeeDAOImpfindEmployee当用户在 JSF 的数据表中放置过滤条件时,它会搜索相应的实体类,即EmployeeEmployee_元模型)

我想知道是否可以对另一个EmployeeAll_仅以过滤器命名的实体类进行分类,即当用户应用过滤器而不是Employee_类时?

Employee_和类之间的区别EmployeeAll_是第一个没有所有员工记录(仅限于他的部门,后者有所有员工(所有部门)。两者都返回相同的数据库列集。

任何帮助都是非常可观的。

EmployeeDAOImpl 类

public void findEmployee(Employee employee) {
        try {
        CriteriaBuilder cb = entityManager.getCriteriaBuilder();
        CriteriaQuery<Employee> e = cb.createQuery(Employee.class);
        Root<Employee> emp = c.from(Employee.class);
        e.orderBy(cb.desc(emp.get("employeeNo")));
        c.select(emp);  

            CriteriaQuery<Long> countQ = cb.createQuery(Long.class);
        Root<Employee> empCount = countQ.from(Employee.class);
        countQ.select(cb.count(empCount));

           String employeeNo = employee.getEmployeeNo("");
           List<Predicate> criteria = new ArrayList<Predicate>();
              if (employeeNo != null) {
                ParameterExpression<String> pexp =
                cb.parameter(String.class,"employeeNo");
                Predicate predicate = 
                cb.like(emp.get(Employee_.employeeNo),pexp);
                criteria.add(predicate);
            } 
                TypedQuery<Employee> q = entityManager.createQuery(c); 
                if (employeeNo != null) {
         q.setParameter("employeeNo", employeeNo+"%");      
                } 
4

1 回答 1

1

避免映射all_employees_view为实体,因为它显示的对象类型与 Employee 基本相同。

将登录的员工信息存储在会话范围的 bean 中,通过 ManagedProperty 注解注入 bean,将其传递给负责构建查询的 dao 服务,最后,是的,在查询条件中使用它。

部门

@Entity
public class Department {
    @Id
    private Integer id;
    @OneToMany(mappedBy="department")
    private Collection<Employee> employees;
}

员工

@Entity
public class Employee {
    @Id
    private Integer id;
    @ManyToOne
    @JoinColumn(name="department_id")
    private Department department;
}

用户Bean

@ManagedBean
@SessionScoped
public class UserBean {
    private Employee user;  // + getter, setter. The property is set during login
}

员工豆

@ManagedBean
@ViewScoped
public class EmployeeBean {
    @ManagedProperty(value="#{userBean}")
    private UserBean userBean;  // + setter
    // this bean retrieves the records pertaining the logged-in user's department:
    Department userDepartment;
    @PostConstruct
    private void init() {
        userDepartment = userBean.getUser().getDepartment();
    }
}

最后,让您的 DAO 服务实现一个以userDepartment输入参数为参数的 find 方法。

于 2013-06-26T08:28:04.087 回答