JavaEE项目实战(OA系统)之十四_员工管理之二
二、员工列表中如何显示部门名称?
这里主要讲解数据来源于两个以上的表时,如何进行数据检索的问题。
一种做法是创建实体类的时候,使用Hibernate的一对多、多对多注解,这种做法数据维护将交由Hibernate管理。
另一种做法是实体类只对应单表,涉及到查询时,另写代码。我们选择这种做法。
1. HQL语句
当数据来源于两个不同实体时,HQL也有两表关联的写法:
String hql = "select u.id, u.name, u.loginName, u.phone, u.sex, u.email, u.remark, u.deptId, d.name deptName from User u, Dept d where u.deptId=d.id and u.deptId=" + deptId;
但是象这样查询属性的用法,最后返回的是值的数组,而不是一个对象。我们可以再定义一个新的实体类,属性跟上述查询一致,再定义一个构造方法,就可以使用HQL的new语法了:
String hql = "select new com.hanhf.oa.basic.user.bean.User2(u.id, u.name, u.loginName, u.phone, u.sex, u.email, u.remark, u.deptId, d.name deptName) from User u, Dept d where u.deptId=d.id and u.deptId=" + deptId;
注意构造方法的参数顺序。
如果你懒得再定义一个新的实体类,也可以在User类中添加一个属性deptName,并新建一个构造方法,不过要注意,这个属性必须声明为@Transient,表示这个属性不与数据库字段关联:
@Transient
public String getDeptName() {
return deptName;
}
public void setDeptName(String deptName) {
this.deptName = deptName;
}
如果没有这个声明,在数据存取时会报错。所以涉及到查询报表时,最好还是单独再定义一个实体类,用于封装查询结果。
DAO类代码:
@Override
public List<User> getByDeptId(int deptId) {
Session session = sessionFactory.getCurrentSession();
Query query = session
.createQuery("select new com.hanhf.oa.basic.user.bean.User(u.id, u.name, u.loginName, u.phone, u.sex, u.email, u.remark, u.deptId, d.name) from User u, Dept d where u.deptId=d.id and u.deptId="
+ deptId);
return (List<User>) query.list();
}
使用jstl展示列表:
<c:forEach items="${userList}" var="user">
<tr>
<td>${user.loginName}</td>
<td>${user.name}</td>
<td>${user.deptName}</td>
<td>${user.sex}</td>
<td><a href="userDel.action?userId=${user.id}">删除</a> <a
href="toUserEdit.action?userId=${user.id}">修改</a> <a
href="resetPassword.action?userId=${user.id}">初始化密码</a></td>
</tr>
</c:forEach>