Hibernate 的查询语言 HQL 之(二)

Hibernate  的查询语言 HQL 之(二)

 数据 库 操作 实现类 类
在 org.sf.dao.impl.DepartmentDaoImpl 实现类中添加如下方法,查询系院信息

public List<Department> getAllDepartmentList(){
List<Department> list = null;
Session session = HibernateSessionFactory.getSession();
Query q=session.createQuery("from Department d");
list = q.list();
session.close();
return list;
}

系 系 院 信息 列表 页面

<%@ page language="java" import="java.util.*" pageEncoding="gbk"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix = "c" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title> 系别信息列表</title>
<link rel="stylesheet" type="text/css" href="css/mycss.css">
</head>
<body>
<jsp:useBean id="depDao" class="org.sf.dao.impl.DepartmentDaoImpl"></jsp:useBean>
<c:set var = "depList" value="${depDao.allDepartmentList}" />
<table align="center" border="1">
<tr>
<td colspan="5" align="center">
<a href="depAdd.jsp"> 添加系别信息</a>
<a href="DepServlet"> 查询系别信息</a>
</td>
</tr>
<tr>
<th> 编码</th>
<th> 名称</th>
<th> 电话</th>
<th> 领导</th>
<th> 操作</th>
</tr>
<c:forEach items="${depList}" var ="dep">
<tr>
<td>${dep.bm }</td>
<td>${dep.mc }</td>
<td>${dep.tell }</td>
<td>${dep.leader }</td>
<td>
<a href="depEdit.jsp?id=${dep.id}"> 修改</a>
<a href="depDel.jsp?id=${dep.id}"> 删除</a>
</td>
</tr>
</c:forEach>
<tr>
<td colspan="5" align="center">
<a href="depAdd.jsp"> 添加系别信息</a>
<a href="DepServlet"> 查询系别信息</a>
</td>
</tr>
</table>
</body>
</html>



  组合 条件 查询
在实际的应用中, 为了提高程序的方便性, 可以使用组合查询条件进行组合
条件查询, 组合查询的关键点是构建查询条件, 下面以查询系院信息为例做组合查询的应用练习

public List<Department> getDepListByQuery(String bm, String mc, String tell, String
		leader)
		{
	List<Department> list = null;
	String hql = "from Department d";
	String where="";
	if(bm!=null && !bm.equals("")){
		where += " where d.bm like '%"+bm+"%'";
	}
	if(mc!=null && !mc.equals("")){
		if(where.equals("")){
			where += " where mc like '%"+mc+"%'";
		}else{
			where += " and mc like '%"+mc+"%'";
		}
	}
	if(tell!=null && !tell.equals("")){
		if(where.equals("")){
			where += " where tell like '%"+tell+"%'";
		}else{
			where += " and tell like '%"+tell+"%'";
		}
	}
	if(leader!=null && !leader.equals("")){
		if(where.equals("")){
			where += " where leader like '%"+leader+"%'";
		}else{
			where += " and leader like '%"+leader+"%'";
		}
	}
	// 判断查询条件是否为空
	
	if(!where.equals("")){
		hql += where;
	}
	Query q = HibernateSessionFactory.getSession().createQuery(hql);
	list = q.list();
	return list;
		}

创建 Servlet 做 做 请求 处理 与 转向

 

<servlet>
<servlet-name>DepServlet</servlet-name>
<servlet-class>org.sf.servlet.DepServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>DepServlet</servlet-name>
<url-pattern>/DepServlet</url-pattern>
</servlet-mapping>


修改 DepServlet 的 doGet 方法如下:

public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
	doPost(request,response);
}

修改 doPost 方法的内容如下:

public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
	//request.setCharacterEncoding("gbk");
	String bm = request.getParameter("bm");
	String mc = request.getParameter("mc");
	if(mc!=null && !mc.equals("")){
		mc = new String(mc.getBytes("iso-8859-1"), "gbk");
	}
	String tell = request.getParameter("tell");
	if(tell!=null && !tell.equals("")){
		tell = new String(tell.getBytes("iso-8859-1"), "gbk");
	}
	String leader = request.getParameter("leader");
	j12Hibernate 
	6
	if(leader!=null && !leader.equals("")){
		leader = new String(leader.getBytes("iso-8859-1"), "gbk");
	}
	IDepartmentDao depDao = new DepartmentDaoImpl();
	List<Department> depList = depDao.getDepListByQuery(bm, mc, tell, leader);
	HttpSession session = request.getSession();
	session.setAttribute("depList", depList);
	response.sendRedirect("depquery.jsp");
}



  实体 间 的 关系 查询
实体间的关系查询可以使用映射文件配置 many-to-one 或 one-to-many 来解
决,也可以使用 join 级联查询来实现

public List<Student> getAllStudentListByJoin(){
	List<Student> list = null;
	Session session = HibernateSessionFactory.getSession();
	Query q = session.createQuery("select s,d from Student s inner join s.department d");
	list = q.list();
	session.close();
	return list;
}

映射 文件 的 配置

<many-to-one name="department" class="org.sf.entity.Department" fetch="select">
<column name="depid">
<comment> 系别id</comment>
</column>
</many-to-one>

 显示信息的页面

<%@ page language="java" import="java.util.*" pageEncoding="gbk"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title> 取得并显示所有的学生</title>
</head>
<body>
<jsp:useBean id="stuDao" class="org.sf.dao.impl.StudentDaoImpl"></jsp:useBean>
<table align="center" border="1">
<tr>
<th> 学号</th>
<th> 姓名</th>
<th> 系院</th>
</tr>
<c:forEach var="stu" items="${stuDao.allStudentListByJoin}">
<tr>
<td>${stu[0].stunumber}</td>
<td>${stu[0].stuname}</td>
<td>${stu[1].mc}</td>
</tr>
</c:forEach>
</table>
</body>
</html>

 

 

级联查询返回对象为多种类型(这个例子中 select s,d from Student s inner join
s.department d, , 返回 的 类型为 为 Student ,Department 两 两 个 类型 ) ,因些要注意取值的方法,
要取得学生信息使用 stu[0],要取得系院信息使用 stu[1]。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值