Hibernate 分页查询 HQL查询

标签: hibernate 分页 hql | 发表时间:2013-10-25 00:14 | 作者:
出处:http://www.iteye.com
/*  前提介绍:
* SQL: 查询的直接对象是数据库中的表(表的结构)--遵循的是国际数据库公共的标准
*
* HQL: 只属于Hibernate 这个ORM 框架,查询的对象不是数据库的表,而是表对应的持久化对象;---操作的是对象
*
* QBC: 只属于ORM框架,它是没有SQL出现的查询(动态查询),查询只存在对象操作上
* 特点:查询的范围有限,只能查询一定的范围,封装性比较好,没有SQL/HQL语句;
*
* Query :  1、是HQL语句的一个专用工具 2、通过该工具对具体的参数进行设置  
* 注意:当查询语句添加条件的时候需要个对象添加别名
*
* 简单的提示:数据库中插入数据后进行commit;
*
* 难点:使用SQL进行表的关联查询;??????

* */



package com.svse.dao;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.criterion.Projection;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;

import com.svse.entity.TDept;
import com.svse.entity.TEmp;
import com.svse.util.HibernateSessionFactoryDaoSupportImpl;

//各种查询的测试
public class QueryDao extends HibernateSessionFactoryDaoSupportImpl
{
	

	/*************************************HQL 查询*********************************************************/
	/***
	 * 类型:位置参数查询--?
	 * 条件:查询性别为男的所有员工的信息
	 */
	public List findBySex(String sex){
		List ar = new ArrayList();

		/* 第一步:通过HQL语句创建Query对象 */
		Query query = this.getSession().createQuery("FROM TEmp a inner join fetch a.TDept where a.ESex=?");

		/* 第二步:设置参数值 ? 从 0 开始 */
		query.setString(0, sex);

		/* 第三步:获取集合数据 */
		ar = query.list();

		//简写
		//ar = this.getSession().createQuery("FROM TEmp a inner join fetch a.TDept where a.ESex=?").setString(0, sex).list();

		/* 第四步:关闭 */
		this.closeAll();

		return ar;
	}

	/***
	 * 	类型:占位符查询
	 * 	条件:性别为男的所有员工信息,部门为研发部
	 */
	public List findEmpBySex_1(String sex,String dep){
		//多写
		List ar = new  ArrayList();
		Query query = this.getSession().createQuery("FROM TEmp a inner join fetch a.TDept where a.ESex=:sex and a.TDept.PName=:dep");
		query.setString("sex", sex);
		query.setString("dep",dep);
		ar = query.list();

		//简写
		//ar = this.getSession().createQuery("FROM TEmp a inner join fetch a.TDept where a.ESex=:sex").setString("sex", sex).list();

		this.closeAll();
		return ar;
	}

	/***
	 * 类型:查询部分字段
	 * 条件:查询所有
	 * 注意:因为HQL操作的是持久化对象,所有查询部分字段返回的是不完整的对象,因此返回的为Object对象的数组
	 */
	public List findSomeField(){
		List ar = this.getSession().createQuery("select a.EName ,a.ESex from TEmp a").list();
		this.closeAll();
		return ar;
	}

	/***
	 * 类型:单一值的查询
	 * 条件:查询条数、最大值、最小值、平均值
	 * 
	 */
	public double findUniqueValue(int type){
		String hql = "";
		switch (type)
		{
		case 1:
			hql = "select count(*) from TEmp";	//查询行目总数
			break;
		case 2:
			hql = "select max(EId) from TEmp";
			break;
		case 3:
			hql = "select min(EId) from TEmp";
			break;
		case 4:
			hql = "select avg(EId) from TEmp";
		}
		double value =Double.parseDouble( this.getSession().createQuery(hql).uniqueResult().toString());
		this.closeAll();
		return value;
	}

	/***
	 * 类型:模糊查询
	 * 条件:查询出名字中带‘小’的,并且是研发部的
	 */
	public List findEmpByLike(String term,String dept){
		List ar = new ArrayList();
		Query query = this.getSession().createQuery("FROM TEmp a inner join fetch a.TDept where a.EName like ? and a.TDept.PName=:dept");
		query.setString(0, '%'+term+'%');
		query.setString("dept",dept);
		ar = query.list();
		return ar;
	}
	/***************************************************************************************************/

	/********************************************* QBC 查询 **************************************************/	
	/***
	 * 类型:QBC 带条件的查询
	 * 条件:性别为男的
	 */
	public List qbc_findEmpBySex(String sex){
		List ar = new ArrayList();

		/* 第一步:得到动态工具 */
		Criteria criteria = this.getSession().createCriteria(TEmp.class);

		/* 第二步:装载参数 ,直接对应实体属性 
		 * Restrictions:限制,约束 */
		criteria.add(Restrictions.eq("ESex", sex));

		/* 表与表之间的关联 */
		criteria.createCriteria("TDept");	

		/* 获得数据对象 */
		ar = criteria.list();

		//简写
		//ar = this.getSession().createCriteria(TEmp.class).add(Restrictions.eq("ESex",sex)).createCriteria("TDept").list();
		this.closeAll();
		return ar;
	}

	/***
	 * 类型:QBC 的模糊查询
	 * 条件:名字中含有小的 ,研发部的
	 */
	public List qbc_findEmpLikeEname(String term,String dept){
		List ar = this.getSession().createCriteria(TEmp.class).add(Restrictions.like("EName",term)).createCriteria("TDept").add(Restrictions.eq("PName",dept)).list();
		this.closeAll();
		return ar;
	}

	/***
	 * 类型:集合查询
	 * 条件:查总函数,查行数
	 */
	public double qbc_collection(){
		double value = 0;
		//获取工具
		Criteria criteria = this.getSession().createCriteria(TEmp.class);
		//设置参数后去行数
		criteria.setProjection(Projections.rowCount());
		//获取单一值
		value = Double.parseDouble(criteria.uniqueResult().toString());
		return value;
	}
	/***********************************************************************************/

	/*******************************利用HQL进行数据的更改************************************************/

	/***
	 * 类型:批量的更新数据
	 * 条件:将ID 为 1 的员工的名字改为:王八蛋
	 */
	public void upEmp(String term,int aim){
		this.beginTransaction();
		Query query = this.getSession().createQuery("update TEmp a set a.EName=? where a.EId =:aim");
		query.setString(0,term);
		query.setInteger("aim",aim);
		query.executeUpdate();
		this.commitTransaction();
	}

	/**
	 * 类型:执行SQL语句
	 * 
	 */
	public void executeSQL(){
		Query query = this.getSession().createSQLQuery("select * from t_emp a ,t_dept b where b.p_id = a.p_id").addEntity(TEmp.class);
		List ar  = query.list();
		this.closeAll();
	}
	
	/**
	 * 类型:分页查询
	 * 条件:开始页数,每页最大的行数
	 * curPage:页码;
	 * lines:每页显示数据条数;
	 * ar_index:集合对应的索引;
	 * 解释:根据此规则实现页面分页效果,例如:达到每页 5 条数据,
	 * 首页:		ar_index = (curPage-1)*5 == 0 
	 * 第二页:	ar_index = (curPage-1)*5 == 5 
	 * 第三页:	ar_index = (curPage-1)*5 == 10
	 * 。。。。。。
	 */
	public List queryForPages(int curPage,int lines){
		Query query = this.getSession().createQuery("FROM TEmp a inner join fetch a.TDept");
		query.setFirstResult((curPage-1)*lines);
		query.setMaxResults(lines);
		List ar = query.list();
		this.closeAll();
		return ar;
	}
	/**  
	 * @return 数据的总条数
	 */
	public int getCounts(){
		int count = Integer.parseInt((this.getSession().createCriteria(TEmp.class).setProjection(Projections.rowCount()).uniqueResult().toString()));
		this.closeAll();
		return count;
	}


	public static void main(String[] args)
	{
		QueryDao dao = new QueryDao();
		List ar = dao.queryForPages(1, 3);
		System.out.println("*********************第一页*******************");
		for (int i = 0; i <ar.size(); i++)
		{
			TEmp emp = (TEmp) ar.get(i);
			System.out.print(emp.getEId()+"  "+emp.getEName()+"  "+emp.getTDept().getPName());
			System.out.println();
		}
		System.out.println("*********************第二页*******************");
		ar = dao.queryForPages(2, 3);
		for (int i = 0; i <ar.size(); i++)
		{
			TEmp emp = (TEmp) ar.get(i);
			System.out.print(emp.getEId()+"  "+emp.getEName()+"  "+emp.getTDept().getPName());
			System.out.println();
		}


	}
}


已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [hibernate 分页 hql] 推荐:

Hibernate 分页查询 HQL查询

- - ITeye博客
/*  前提介绍:. * SQL: 查询的直接对象是数据库中的表(表的结构)--遵循的是国际数据库公共的标准. 只属于Hibernate 这个ORM 框架,查询的对象不是数据库的表,而是表对应的持久化对象;---操作的是对象. 只属于ORM框架,它是没有SQL出现的查询(动态查询),查询只存在对象操作上.

Hibernate 的HQL,QBC 查询语言

- - ITeye博客
1.HQL:(Hibernate Query Language) 是面向对象的查询语言. String hql="from Deptas model where mode.deptName='人事部' ";. String hql="from Deptas model where mode.deptName like '%部%' ";.

Hibernate HQL注入攻击入门

- - FreeBuf.COM
SQL注入是一种大家非常熟悉的攻击方式,目前网络上有大量存在注入漏洞的DBMS(如MySQL,Oracle,MSSQL等). 但是,我在网络上找不到针对Hibernate查询语言的相关资源. 因此本文总结了笔者在阅读文档和不断试验过程中的一些经验技巧. Hibernate是一种ORM框架,用来映射与tables相关的类定义(代码),并包含一些高级特性,包括缓存以及继承,通常在Java与.NET中使用(可参考 NHibernate),但在Java生态系统中更受欢迎.

自定义 Hibernate 的 HQL 函数

- - CSDN博客互联网推荐文章
 有时候我们使用一些数据库特有的SQL语法跟HQL有冲突怎么办,看看这个. 标签: HQL  Dialect  MySQL  Hibernate. [1].[代码] MySQLExtendDialect.java  跳至  [1]. * 作者: Winter Lau. * 时间: 2009-4-13.

HQL查询

- - CSDN博客推荐文章
HQL语句与SQL语句相似,其基本的使用习惯也与SQL相同. 由于HQL是面向对象的查询语句,所以它需要从目标对象中查询信息并返回匹配单个实体对象或多个实体对象的集合,而SQL语句是从数据库的表中查找指定信息,返回的是单条信息或多个信息的集合. select "对象.属性名" from "对象" where "过滤条件" group by "对象.属性名" having "分组条件" order by "对象名.属性名".

动态加载HQL

- senyo - BlogJava-首页技术区
Java代码如下:(ReloadableDynamicHibernate.java). 135         private Map qlMap;                //查询的映射. 这样就实现了每次修改SQL or HQL语句后不用重启服务器,立刻看到结果,加快了开发速度.

HIVE优化提示-如何写好HQL

- - CSDN博客云计算推荐文章
一、     Hive join优化. 也可以显示声明进行map join:特别适用于小表join大表的时候,SELECT /*+ MAPJOIN(b) */ a.key, a.value FROM a join b on a.key = b.key. 2.     注意带表分区的join, 如:.

Hibernate面试题

- - ITeye博客
什么是Hibernate的并发机制. Hibernate并发机制:. a、Hibernate的Session对象是非线程安全的,对于单个请求,单个会话,单个的工作单元(即单个事务,单个线程),它通常只使用一次,. 如果一个Session 实例允许共享的话,那些支持并发运行的,例如Http request,session beans将会导致出现资源争用.

Hibernate Lazy属性

- - 博客园_首页
  Hibernate 的延迟加载(lazy load)是一个被广泛使用的技术. 这种延迟加载保证了应用只有在需要时才去数据库中抓取相应的记录. 通过延迟加载技术可以避免过多、过早地加载数据表里的数据,从而降低应用的内存开销. Hibernate 的延迟加载本质上就是代理模式的应用,当程序通过 Hibernate 装载一个实体时,默认情况下,Hibernate 并不会立即抓取它的集合属性、关联实体所以对应的记录,而是通过生成一个代理来表示这些集合属性、关联实体,这就是代理模式应用带来的优势.

Hibernate 缓存

- - ITeye博客
1数据缓存:(date caching) 是一种将数据暂时存于内存缓存去中的技术,缓存通常是影响系统性能的关键因素. 2.ORM的数据缓存策略有3中.   1.事务级缓存:  分为 数据库事务和 应用级事务,是基于Session的生命周期的实现,每个session都会在内部维持一个数据缓存, 随session的创建和消亡.