基本情况
Struts2框架下,学生 Student 与紧急联系人 Contact 是一对一关系,关系维护方在 Student。在前端页面修改学生信息时,提交信息不包含 Contact,需要在后台通过 HQL 语句进行关联,这里尝试用内连接实现——
等效 SQL:
SELECT c.* FROM Contact c INNER JOIN Student s ON c.id = s.cid WHERE s.id = ?;
StudentAction.java:
Contact c = new ContactDAO().getContactByStudentId(student.getId());
student.setContact(c);
new StudentDao().updateStudent(student);
ContactDAO.java:
public Contact getContactByStudentId(int sid) {
session = HibernateUtils.openSession();
session.beginTransaction();
Contact contact = (Contact) session.createQuery("SELECT c FROM Contact c INNER JOIN c.student s WHERE s.id=?")
.setParameter(0, sid)
.uniqueResult();
session.getTransaction().commit();
session.close();
return contact;
}
1、HQL 语句中的 SELECT c 不能少,表示获取的是 Contact 对象,否则强转报错;
2、语句中的 INNER 可以省略不写;
3、原解决方案是在页面添加多个类似 <input type="hidden" name="student.contact.id" value="${STUDENT.contact.id}" /> 的标签获取 Contact 的相关信息,其效率明显不如直接在后台通过 HQL 完成关联。