Hibernate 的查询语言 HQL 与高级查询

Hibernate  的查询语言 HQL  与高级查询

数据库操作实现类的开发

import java.util.List;
import org.hibernate.Query;
import org.hibernate.SQLQuery;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.sf.dao.IDepartmentDao;
import org.sf.entity.Department;
import org.sf.util.HibernateSessionFactory;
public class DepartmentDaoImpl implements IDepartmentDao {
	/**
	 *  取得所有的系院信息集合
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public List<Department> getAllDepartmentList(){
		List<Department> list = null;
		Session session = HibernateSessionFactory.getSession();
		Query q=session.createQuery("from Department");
		list = q.list();
		session.close();
		return list;
	}
	/**
	 *  通过id 取得某个系院信息
	 * @param id
	 * @return
	 */
	public Department getDepartmentById(int id){
		Department department = null;
		Session session = HibernateSessionFactory.getSession();
		Query q =session.createQuery("from Department where id=:id").setParameter("id",
				id);
		department=(Department)q.uniqueResult();
		session.close();
		return department;
	}
	/**
	 *  添加系院信息
	 * @param department
	 * @return
	 */
	public Department addDepartment(Department department){
		Session session = HibernateSessionFactory.getSession();
		Transaction tran = session.beginTransaction();
		session.save(department);
		tran.commit();
		session.close();
		return department;
	}
	/**
	 *  修改选定的系院信息
	 * @param department
	 */
	public void editDepartment(Department department){
		Session session = HibernateSessionFactory.getSession();
		Transaction tran = session.beginTransaction();
		Department depEdit = (Department) session.load(Department.class,
				department.getId());
		depEdit.setBm(department.getBm());
		depEdit.setMc(department.getMc());
		depEdit.setTell(department.getTell());
		depEdit.setLeader(department.getLeader());
		session.update(depEdit);
		tran.commit();
		session.close();
	}
	/**
	 *  通过id 删除系院信息
	 * @param id
	 * @return
	 */
	public int delDepartmentById(int id){
		int i = 0;
		Session session = HibernateSessionFactory.getSession();
		Transaction tran = session.beginTransaction();
		SQLQuery q = (SQLQuery) session.createSQLQuery("delete from department where
				id=:id").setParameter("id", id);
				q.executeUpdate();
				tran.commit();
				session.close();
				return i;
	}
}

制作 IStudentDao  接口及 及 StudentDaoImpl

import java.util.List;
import org.sf.entity.Student;
/**
 *  学生数据库操作接口
 * @author  宋锋
 * @date 2013-04-25
 */
public interface IStudentDao {
	/**
	 *  取得所有的学生信息
	 * @return
	 */
	public List<Student> getAllStudentList();
	/**
	 *  通过 id  取得某个学生信息
	 * @param id
	 * @return
	 */
	public Student getStuentById(int id);
	/**
	 *  通过学号和密码取得学生信息,用于登录
	 * @param stunumber
	 * @param stupwd
	 * @return
	 */
	public Student getStudentByStunumberAndStupwd(String stunumber, String stupwd);
	/**
	 *  取得学生的总数信息
	 * @return
	 */
	public int getStudentCount();
	/**
	 *  取得学生分页信息
	 * @param pageNum
	 * @param pageSize
	 * @return
	 */
	public List<Student> getStudentPageList(int pageNum, int pageSize);
	/**
	 *  通过系院 id  取得学生信息
	 * @param depid
	 * @return
	 */
	public List<Student> getStudentListByDepid(int depid);
	/**
	 *  添加学生信息
	 * @param student
	 * @return
	 */
	public Student addStudent(Student student);
	/**
	 *  修改选定的学生信息
	 * @param student
	 */
	public void editStudent(Student student);
	/**
	 *  删除学生信息
	 * @param id
	 * @return
	 */
	public int delStudentById(int id);
}

数据库操作类的开发

import java.util.List;
import org.hibernate.Query;
import org.hibernate.SQLQuery;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.sf.entity.Student;
import org.sf.util.HibernateSessionFactory;
import org.sf.dao.IStudentDao;
/**
 *  学生数据库操作实现类
 * @author  宋锋
 * @date 2013-04-25
 */
public class StudentDaoImpl implements IStudentDao {
	/**
	 *  取得所有的学生信息
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public List<Student> getAllStudentList(){
		List<Student> list = null;
		Session session = HibernateSessionFactory.getSession();
		Query q = session.createQuery("from Student");
		list = q.list();
		session.close();
		return list;
	}
	/**
	 *  通过id 取得某个学生信息
	 * @param id
	 * @return
	 */
	public Student getStuentById(int id){
		Student student = null;
		Session session = HibernateSessionFactory.getSession();
		Query q = session.createQuery("from Student where id=?");
		q.setInteger(0, id);
		student = (Student)q.uniqueResult();
		session.close();
		return student;
	}
	/**
	 *  通过学号和密码取得学生信息,用于登录
	 * @param stunumber
	 * @param stupwd
	 * @return
	 */
	public Student getStudentByStunumberAndStupwd(String stunumber, String stupwd){
		Student student = null;
		Session session = HibernateSessionFactory.getSession();
		Query q = session.createQuery("from Student where stunumber=? and stupwd=?");
		q.setString(0, stunumber);
		q.setString(1, stupwd);
		student = (Student)q.uniqueResult();
		session.close();
		return student;
	}

	/**
	 *  取得学生的总数信息
	 * @return
	 */
	public int getStudentCount(){
		int count = 0;
		Session session = HibernateSessionFactory.getSession();
		Query q = session.createQuery("select count(s) from Student s");
		Number number = (Number)q.uniqueResult();
		count = number.intValue();
		session.close();
		return count;
	}
	/**
	 *  取得学生分页信息
	 * @param pageNum
	 * @param pageSize
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public List<Student> getStudentPageList(int pageNum, int pageSize){
		List<Student> list = null;
		Session session = HibernateSessionFactory.getSession();
		Query q = session.createQuery("from Student");
		q.setFirstResult((pageNum-1)*pageSize);
		q.setMaxResults(pageSize);
		list = q.list();
		session.close();
		return list;
	}
	/**
	 *  通过 系院id 取得学生信息
	 * @param depid
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public List<Student> getStudentListByDepid(int depid){
		List<Student> list = null;
		Session session = HibernateSessionFactory.getSession();
		Query q= session.createQuery("from Student where department.id=?");
		q.setInteger(0, depid);
		list = q.list();
		session.close();
		return list;
	}
	/**
	 *  添加学生信息
	 * @param student
	 * @return
	 */
	public Student addStudent(Student student){
		Session session = HibernateSessionFactory.getSession();
		Transaction tran = session.beginTransaction();
		session.save(student);
		tran.commit();
		session.close();
		return student;
	}
	/**
	 *  修改选定的学生信息
	 * @param student
	 */
	public void editStudent(Student student){
		Session session = HibernateSessionFactory.getSession();
		Transaction tran = session.beginTransaction();
		Student stuEdit = (Student)session.load(Student.class, student.getId());
		stuEdit.setStunumber(student.getStunumber());
		stuEdit.setStuname(student.getStuname());
		stuEdit.setStupwd(student.getStupwd());
		stuEdit.setDepartment(student.getDepartment());
		session.update(stuEdit);
		tran.commit();
		session.close();
	}
	/**
	 *  删除学生信息
	 * @param id
	 * @return
	 */
	public int delStudentById(int id){
		int i = 0;
		Session session = HibernateSessionFactory.getSession();
		Transaction tran = session.beginTransaction();
		SQLQuery sq= session.createSQLQuery("delete from student where id=:id");
		sq.setParameter("id", id);
		i = sq.executeUpdate();
		tran.commit();
		session.close();
		return i;
	}
}

修改 Student.hbm.xml 中 中的 的 many-to-one 关系

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

实现 students.jsp  页面

<%@ 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.allStudentList}">
<tr>
<td>${stu.stunumber}</td>
<td>${stu.stuname}</td>
<td>${stu.department.mc}</td>
</tr>
</c:forEach>
</table>
</body>
</html>

制作学生的分页显示 pagestudents.jsp

<%@ page language="java" import="java.util.*" pageEncoding="gbk"%>
<%@page import="org.sf.dao.impl.StudentDaoImpl"%>
<%@page import="org.sf.dao.IStudentDao"%>
<%@page import="org.sf.entity.Student"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title> 分页显示学生信息</title>
</head>
<body>
<table align="center" border="1">
<tr>
<th> 学号</th>
<th> 姓名</th>
<th> 系院</th>
</tr>
<%
String strPageNum = request.getParameter("pageNum");
int pageNum = 1; // 当前 页面
int pageSize = 3; // 每页的记录条数
int pageSum = 0; // 总页面数
if(strPageNum!=null) // 如果取到了数据,则为调用而来
{
pageNum = Integer.parseInt(strPageNum);
}
IStudentDao stuDao = new StudentDaoImpl();
List<Student> list = stuDao.getStudentPageList(pageNum, pageSize);
 iCount = stuDao.getStudentCount(); // 记录总数
// 计算总页面数
pageSum = iCount/pageSize;
if(iCount%pageSize!=0){
pageSum+=1;
}
if(list.size()>0){
for(Student stu:list){
%>
<tr>
<td><%=stu.getStunumber() %></td>
<td><%=stu.getStuname() %></td>
<td><%=stu.getDepartment().getMc() %></td>
</tr>
<%
}
}
%>
<tr><td colspan="3" align="center">
<%
out.print(" 第["+pageNum+"] 页,共["+pageSum+"] 页");
if(pageNum<2){
%>
上 上1 页
<%
}else{
%>
<a href="pagestudents.jsp?pageNum=<%=pageNum-1 %>" > 上1 页</a>
<%
}
%>
  
<%
if(pageNum>=pageSum){
%>
上 上1 页
<%
}else{
%>
<a href="pagestudents.jsp?pageNum=<%=pageNum+1 %>" > 下1 页</a>
<%
}
%>
</td></tr>
</table>
</body>
</html>

制作通过系院查询学生信息的 depstudents.jsp

在 WebRoot 下创建 depstudent.jsp 页面, 当进入页面时显示全部的学生信息,

点击选择系院信息后,显示该系院中的学生信息,

<%@ page language="java" import="java.util.*" pageEncoding="gbk"%>
<%@page import="org.sf.entity.Student"%>
<%@ 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>
<jsp:useBean id="depDao" class="org.sf.dao.impl.DepartmentDaoImpl"></jsp:useBean>
<%
String strDepid = request.getParameter("depid");
List<Student> list= null;
if(strDepid==null || strDepid.equals("") || strDepid.equals("0")){ // 查询所有的数据
list = stuDao.getAllStudentList();
}else{
int depid = Integer.parseInt(strDepid);
request.setAttribute("depid", depid);
list = stuDao.getStudentListByDepid(depid);
}
%>
<table align="center" border="1">
<tr>
<td colspan="3" align="center">
<form action="depstudents.jsp">
系院信息:
<select id="depid" name="depid">
<option value="0">-- 请选择--</option>
<c:forEach var="dep" items="${depDao.allDepartmentList}">
<c:choose>
<c:when test="${depid==dep.id}">
<option value="${dep.id}" selected="selected">${dep.mc}</option>
</c:when>
<c:otherwise>
<option value="${dep.id}">${dep.mc}</option>
</c:otherwise>
</c:choose>
</c:forEach>
</select>
<input type="submit" value=" 查询学生 " />
</form>
</td>
</tr>
<tr>
<th> 学号</th>
<th> 姓名</th>
<th> 系院</th>
</tr>
<%
if(list!=null){
for(Student stu:list){
%>
<tr>
<td><%=stu.getStunumber() %></td>
<td><%=stu.getStuname() %></td>
<td><%=stu.getDepartment().getMc() %></td>
</tr>
<%
}
}
%>
</table>
</body>
</html>

下面关于所用到的数据库,实体映射请参考上一篇文章  实体映射

时间: 2024-08-10 21:29:20

Hibernate 的查询语言 HQL 与高级查询的相关文章

hibernate中使用HQL进行数据库查询

1.写的规则比较简单,我讲一下,如图Station这个不是数据库中的表,而是entity包中的类名Station,可以省略 select * 2.返回的类型自动转化为String类型,不用你自己再转化. 3.原生数据库返回的是object,需要进行转化 备注:

【HQL】hibernate查询语言hql

hibernate查询语言hql 在hql中关键字不区分大小写,通常小写,类的名称和属性名称必须区分大小写 1.简单属性查询[重要] * 单一属性查询,返会属性结果集列表,元素类型和实体类中相应的类型一致 * 多个属性查询,多个属性查询返会对象数组,对象数组的长度取决于属性的个数 对象数组中元素的类型取决于属性在实体类中的类型 * 如果认为返会数组不够对象化,可以使用hql动态实例化Student对象 参见:SimplePropertyQueryTest.java 2.实体对象查询[重要] *

Hibernate关联映射及高级查询

一.Hibernate中的关联关系 1.1.单向一对多关联关系 按照以下步骤配置hibernate中持久化类的一对多对象关联: (1).持久化类添加关联类的相关属性及getter/setter方法. (2).映射文件中建立该属性和数据库表字段的映射信息. 比如班级对学生是一对多的关系,班级类Grade类和Grade.hbm.xml文件如下: package com.pb.hibernate.po; import java.util.HashSet; import java.util.Set; p

【Hibernate步步为营】--hql查询之实体对象查询

上篇文章简单介绍了hql它作为Hibernate的查询语言,封装了基本上SQL的所有查询操作,HQL能够实现对数据库文件的增删改查,该篇文章着重讨论HQL实体对象的查询方法. 一.实体对象查询 实体对象查询是hql查询的基础,作为一种对象查询语言,在查询操作时和sql不同,查询字符串中的内容要使用类名和类的属性名来代替.这种查询方法相对简单,只要有SQL功底,使用hql是很简单的,但是有一些问题需要注意,就是查询获取数据不是目的,需要考虑的是如何编写出高效的查询语句,这才是讨论的重点. 1.1

【Hibernate步步为营】--hql查询小介

HQL 是指Hibernate Query Language,它是Hibernate的查询语言,拥有一套自己的查询机制,它的查询语句和SQL非常类似.在使用的时候可以非常快上手.HQL提供了基本上SQL全部的查询功能,可是在使用HQL查询时有非常多地方须要注意.该篇文章整理了HQL查询过程中须要注意的一些主要的语法问题,在使用HQL查询时希望避免这些问题. 一.Hibernate简单介绍 HQL採用的是标准化对象查询.它是以对象的方式进行查询.将查询语句封装为对象操作.长处:可读性好.复合jav

NHibernate之旅(3):探索查询之NHibernate查询语言(HQL)

本节内容 NHibernate中的查询方法 NHibernate查询语言(HQL) 1.from子句 2.select子句 3.where子句 4.order by子句 5.group by子句 实例分析 结语 上一节,我们初步搭建了一个NHibernate程序,完成了映射Customer表并读取数据功能,这一节和下一节我们初步探讨一下在NHibernate中的查询方法.我这之前还是先回忆一下上一节完成的东西,其中一张图很多人回复说非常经典,简单明了!还是看着图.总结一下上一节三个重要的事情:建

[转]NHibernate之旅(3):探索查询之NHibernate查询语言(HQL)

本节内容 NHibernate中的查询方法 NHibernate查询语言(HQL) 1.from子句 2.select子句 3.where子句 4.order by子句 5.group by子句 实例分析 结语 上一节,我们初步搭建了一个NHibernate程序,完成了映射Customer表并读取数据功能,这一节和下一节我们初步探讨一下在NHibernate中的查询方法.我这之前还是先回忆一下上一节完成的东西,其中一张图很多人回复说非常经典,简单明了!还是看着图.总结一下上一节三个重要的事情:建

Hibernate中的HQL查询与缓存机制

HQL:完全面向对象查询 SQL的执行顺序: 1.From 2.Where 过滤基础数据 where与having的区别:1.顺序不同 2.where过滤基础数据 3. 过滤聚合函数 3.Group by 4.Select 5.Having 6.Order by   使用Hibernate查询时,使用hibernate的一个接口query Hql是面向对象的查询语句,所以跟的是类名 Query query = session.createQuery("select id,name,stu.cla

[Hibernate Search] (5) 高级查询 - 过滤,投影和分面

高级查询 在介绍了更多的高级映射功能之后,是时候回顾一下之前介绍过的查询功能了,看看如何借助这些高级的映射功能来使用一些高级的查询功能.本文会通过以下几个方面进行介绍: 如何在不和数据库进行任何交互的前提下,借助Lucene的力量来动态的筛选结果 如何通过使用基于投影(Projection)的查询来获取需要的属性,从而避免与数据库的交互 如何使用分面搜索(Faceted Search)对搜索结果进行划分 如何使用查询时提升(Boosting) 如何给查询设置时间限制 过滤(Filtering)