Hibernate 的HQL,QBC 查询语言

标签: hibernate hql qbc | 发表时间:2012-11-11 17:25 | 作者:
出处:http://www.iteye.com
1.HQL:(Hibernate Query Language) 是面向对象的查询语言

1.实体查询
	public void testQueryAllDept(){
	String hql="from Employee";
        //hql="from com.sh.Entity";
	Query query=session.createQuery(hql);
	
	List<Employee> list= query.list();

	//...
	}


2.有条件的 实体查询
	public void testQueryAllDept(){
	String hql="from Deptas model where mode.deptName='人事部' ";
        //hql="from com.sh.Entity";
	Query query=session.createQuery(hql);
	
	List<Employee> list= query.list();

	//...
	}
	public void testQueryAllDept(){
	String hql="from Deptas model where mode.deptName like '%部%' ";
        //hql="from com.sh.Entity";
	Query query=session.createQuery(hql);
	
	List<Employee> list= query.list();

	//...
	}

  public void testQueryDeptByGt(){

  String hql="from Dept model where model.createDate> '2012-03-10'";
  Query query=session.createQuery(hql);
  List<Employee> list= query.list();
  }



3.HQL 中的各种运算符
运算符类型 HQL运算符 含义
比较运算 = 等于
<> 不等于
> 大于
>= 大于等于
<= 小于等于
< 小于
is null 为空
is not null 不为空
范围运算 in 等于列表中的某一值
not in 不等于列表中的任意一个值
between  p1 and p2 大于等于值1  且 小于等于值2
not between p1 and p2 小于值1 或者 大于 值2
字符串模式匹配 like 字符串模式匹配
逻辑运算 and
or
not


3.更新 删除
public void testModifyDate(){
		Transaction tr=session.beginTransaction();
		Dept detp=(Dept)session.get(Detp.class,new Integer(6));
		detp.seteCreateDate("2000-03-10");
		tr.commit();
		
	}

// delete  删除
public void testDelDeptByHql(){
		Transaction tr=session.beginTransaction();
		String hql="delete Dept as model where model.deptId=6";
		Query query=session.createQuery(hql);
		query.executeUpdate();
		tr.commit();
	}



4.属性查询
	public void testQueryDeptName(){
		String hql="select model.deptName from Dept as model";
		Query query=session.createQuery(hql);
		List<String> deptNameList=query.list();
		//...
	}
        public void testQueryDeptName(){
		String hql="select model.deptName,model.createDate from Dept as model";
		Query query=session.createQuery(hql);
		List<Object[]> prsList=query.list();
                for(){
                }               
		//...
	}
     
    //采用对象进行 保存 查询的字段(要添加 对应字段的构造方法)
     public void testQueryDeptName(){
		String hql="select new Dapt(model.deptName,model.createDate) from Dept as model";
		Query query=session.createQuery(hql);
		List<Dept> deptList=query.list();
                for(Dept d:deptList){
                 
                   d.setDeptName("test");
                   session.saveOrUpdate(dept);
                }               
		//...
	}

     
    //如果采用对象 保存上面查询出来的对象  如果对其进行更新的操作 是不会成功的

	public void testSaveDept(){
		Transction  tr=session.beginTransactino();
		String hql="select new Dept(model.deptName,model.createDate) from Dept as model";
		Query query=session.createQuery();
		List<Dept> deptList=query.list();
		for(Dept dept:deptList){
			System.out.println(dept.deptName);
			dept.setDetpName("test");
			session.saveOrUpdate(dept);
		}
		tr.commit();
       // 最后 根本就没有更新 而是 在数据库中 插入 新的记录
	}



5.使用函数
public void testQuyeryFunction(){
		String hql="select count(*),min(model.createDate) from Dept as model";
		Query query=session.createQuery(hql);
		List<Object[]> paramsList=query.list();
		for(){
			
		}
		//...
	}



6.分组 与 排序
//排序
public void testQueryOrderBy(){
		String hql="from Dept as mode order by   model.createDate,model.deptName desc";
		Query query=session.createQuery();
		List<Dept> deptList=query.list();
		for(){}
		//
		
	}

//分组 并且 使用  having 筛选
public void testQueryGroupBy(){
		String hql="select count(model),model.deptName from Dept as model group by model.deptName having count(model)>1";
		Query query=session.createQuery();
		List<Object[]> list=query.list();
		//...
	}



7.查询单个对象
public void testQueryUn(){
		String hql="select model.deptName from Dept as model where model.deptId=2";
		Query query=session.createQuery(hql);
		query.setMaxResults(1);
		String deptName=(String)query.uniqueResult();
		System.out.println(deptNamae);
	}



8.绑定参数
释义:Hibernate中也采用了preparedStatement作为底层数据库的的访问方式,与之对应的SQL语句 可以重用preparedStatement对象, 首先会预编译,然后缓存起来,提高性能.

1.使用 ":"加参数名 绑定参数

	public void  testQueryByParamsName(){
            //使用  ":参数名" 来传递参数
		String hql="from Dept as model where 
model.deptName=:deptName and model.createDate=:createDate";

		Query query=session.createQuery(hql);
		query.setString("deptName","test");
		query.setString("ceateDate","2000-02-10");
		List<Dept> deptList=query.list();
		for(){}
		
		//...
		
	}


2.使用 "?" 按照位置来绑定参数
	
	public void testQueryByParamsID(){
		String hql="from Dept as model where model.deptName=? and model.createDate=?";
		Query query=session.createQuery(hql);
		query.setString(0,"test");
		query.setString(1,"2000-02-02");
		List<Dept> list=query.list();
		for(){}
		//..
	}



3.采用setEntity() 将参数和一个持久化对象进行绑定
public void testQueryByDept(){
		Dept dept=(Dept)Session.get(Dept.clas,new Integer(2));
		String hql="select Employee  as model where model.dept=?"
		Query query=session.createQuery(hql);
		query.setEntity(0,dept);
		List<Employee> empList=query.list();
		for(){}
		//..
		
		
	}


4.setParameter() 用于绑定任意类型的参数
public void testQueryBySetParams(){
		String hql="from Dept as model where model.deptName=?";
		Query query=session.createQuery(hql);
		query.setParameter(0,"test");
		List<Dept> deptList=query.list();
		for(){}
		//..
	}


5.setProperties() 将一个参数名 于一个对象的属性值绑定
public void testQueryBySetPro(){
		Dept deptNew=new  Dept();
		deptNew.setDeptName("test");
		
		String hql="from Dept as model where model.deptName=:deptName";
		Query query=session.createQuery();
		query.setProperties(deptNew);
		List<Dept> deptList=query.list();
		for(){
			
		}
		//..
		
	}



10. 联合查询
inner join
public void testQueryInnerJoin(){
		String hql="from Dept as model inner join model1.employees as model2";
		Query query=session.createQuery(hql);
		List<Object[]> objList=query.list();
		for(Object[] obj:objList){
			Dept dept=(Dept)obj[0];
			Employee emp=(Employee)obj[1];
			System.out.println("xxxx");
		}
	}


left join
public void testQueryLeftJoin(){
		String hql="from Dept as model left join model1.employees as model2";
		Query query=session.createQuery(hql);
		List<Object[]> objList=query.list();
		for(Object[] obj:objList){
			Dept dept=(Dept)obj[0];
			Employee emp=(Employee)obj[1]; //有可能为空 所以需要判断
			if(mep!=null){
				System.out.println("xxxx");
			}else{
				System.out.println(null);
			}
			System.out.println(dept.getDeptName());
		}
	}


right join
	public void testQueryRightJoin(){
		String hql="from Dept as model right join model1.employees as model2";
		Query query=session.createQuery(hql);
		List<Object[]> objList=query.list();
		for(Object[] obj:objList){
			Dept dept=(Dept)obj[0];
			Employee emp=(Employee)obj[1]; //有可能为空 所以需要判断
			if(dept!=null){
				System.out.println(dept.getDeptName());
			}else{
				System.out.println(null);
			}
			System.out.println("dd"+emp.getEmployeeName());
		}
	}


11.子查询

	public void testQueryChild(){
		String hql="from Dept as model where (select count(*) from model.employee) >2";
		Query query=session.createQuery(hql);
		List<Dept> objList=query.list();
		for(){}
		//..
	}


12 Criteria 查询
释义:通过面向对象的设计将数据查询条件封装在一个对象
//无条件
public void testQueryDept(){
		Criteria criteria=session.createCriteria(Dept.class);
		List<Dept> deptList=criteria.list();
		for(){}
		//..
	}

//添加条件
public void testQueryDeptByName(){
		Criteria criteria=session.createCriteria(Dept.class);
		criteria.add(Expression.eq("deptName", "人事部"));
		List<Dept> deptList=criteria.list();
		for(){}
		//..
	}


SQL语法查询机制
方法 描述
Expression.eq 对应sql中的field =value
Expression.gt 对应sql中的field>value
Expression.ge 对应sql中的field>=value
Expression.lt 对应sql中的field<value
Expression.le 对应sql中的field<=value
Expression.between 对应sql中的between
Expression.like 对应 like
Expression.in 对应 in
Expression.eqProperty 用于比较两个属性之间的值,对应的Sql条件中field=field
Expression.gtProperty 用于比较两个属性之间的值,对Sqlfiled>field
Expression.geProperty 用于比较两个属性之间的值,对应sql field>=field
Expression.ltProperty 用于比较两个属性之间的值,对应field<field
Expression.leProperty 用于比较 两个属性之间的值,对应field<=field



Hibernate3中采用Restrictions类代替Expression

public void  testQueryDeptByNameRe(){
		Criteria  criteria=session.createCriteria(Dept.class);
		criteria.add(Restrictions.eq("deptName", "人事部"));
		List<Dept> deptList=criteria.list();
		for(){}
		//..
		
	}



Criteria中限定返回的行数
public void testQueryDept(){
		Criteria criteria=session.createCriteria(Dept.class);
		criteria.setFirstResult(2);
		criteria.setMaxResults(2);
		List<Dept> deptList=criteria.list();
		for(){}
		//..
	}


Criteria拍戏
public void testQueryDept(){
		Criteria criteria=session.createCriteria(Dept.class);
		criteria.addOrder(Order.asc("createDate"));
		List<Dept> deptList=criteria.list();
		for(){}
		//..
	}


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


ITeye推荐



相关 [hibernate hql qbc] 推荐:

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查询

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

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.

第十一章 Hibernate的查询 Query by Criteria(QBC)

- - CSDN博客架构设计推荐文章
QBC(QueryByCriteria)查询方式是Hibernate提供的“更加面向对象”的一种检索方式. QBC在条件查询上比HQL查询更为灵活,而且支持运行时动态生成查询语句. 1、在Hibernate应用中使用QBC查询通常经过3个步骤.  (1)使用Session实例的createCriteria()方法创建Criteria对象.

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 并不会立即抓取它的集合属性、关联实体所以对应的记录,而是通过生成一个代理来表示这些集合属性、关联实体,这就是代理模式应用带来的优势.