Hibernate的HQL,QBC 查询语言(包括多表联合查询join)

引用链接:http://takeme.iteye.com/blog/1722522  

参考链接:

in和not in用法:http://blog.csdn.net/shiqidide/article/details/7327460   或   http://blog.csdn.net/shiqidide/article/details/7327460

Enum映射策略:http://blog.csdn.net/lmy86263/article/details/52650721?locationNum=11

多表查询:http://www.cnblogs.com/cyjch/archive/2012/03/14/2395340.html


个人应用实例


String hql = "from Notice as notice inner join notice.contract as contract join contract.accountManager as staff with staff.id =:id  where notice.status =:status ";
List<Notice> list = noticeDao.findList(hql, new Parameter(new Object[][]{{"id", id}, {"status", NoticeTypeEnum.PLEDGE_START}}));


注意点:
  1. 若属性为Enum,则条件语句参数也要是Enum类,不能用int代替;
  2. join后的with条件语句一次只能带一个,否则会报错with-clause referenced two different from-clause elements
  3. where语句放在join语句之后,否则会报错无法识别token



Hibernate的HQL,QBC 查询语言(包括多表联合查询join)

链接:http://takeme.iteye.com/blog/1722522  



1.HQL:(Hibernate Query Language) 是面向对象的查询语言 

1.实体查询 
Java代码   收藏代码


  1. public void testQueryAllDept(){  

  2. String hql=”from Employee”;  

  3.        //hql=”from com.sh.Entity”;  

  4. Query query=session.createQuery(hql);  

  5.   

  6. List<Employee> list= query.list();  

  7.   

  8. //…  

  9. }  




2.有条件的 实体查询 
Java代码   收藏代码


  1. public void testQueryAllDept(){  

  2. String hql=”from Deptas model where mode.deptName=’人事部’ ”;  

  3.        //hql=”from com.sh.Entity”;  

  4. Query query=session.createQuery(hql);  

  5.   

  6. List<Employee> list= query.list();  

  7.   

  8. //…  

  9. }  

  10. public void testQueryAllDept(){  

  11. String hql=”from Deptas model where mode.deptName like ’%部%’ ”;  

  12.        //hql=”from com.sh.Entity”;  

  13. Query query=session.createQuery(hql);  

  14.   

  15. List<Employee> list= query.list();  

  16.   

  17. //…  

  18. }  

  19.   

  20.  public void testQueryDeptByGt(){  

  21.   

  22.  String hql=”from Dept model where model.createDate> ‘2012-03-10’”;  

  23.  Query query=session.createQuery(hql);  

  24.  List<Employee> list= query.list();  

  25.  }  





3.HQL 中的各种运算符 



















































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


3.更新 删除 
Java代码   收藏代码


  1. public void testModifyDate(){  

  2.         Transaction tr=session.beginTransaction();  

  3.         Dept detp=(Dept)session.get(Detp.class,new Integer(6));  

  4.         detp.seteCreateDate(”2000-03-10”);  

  5.         tr.commit();  

  6.           

  7.     }  

  8.   

  9. // delete  删除  

  10. public void testDelDeptByHql(){  

  11.         Transaction tr=session.beginTransaction();  

  12.         String hql=”delete Dept as model where model.deptId=6”;  

  13.         Query query=session.createQuery(hql);  

  14.         query.executeUpdate();  

  15.         tr.commit();  

  16.     }  




4.属性查询 
Java代码   收藏代码


  1. public void testQueryDeptName(){  

  2.     String hql=”select model.deptName from Dept as model”;  

  3.     Query query=session.createQuery(hql);  

  4.     List<String> deptNameList=query.list();  

  5.     //…  

  6. }  

  7.        public void testQueryDeptName(){  

  8.     String hql=”select model.deptName,model.createDate from Dept as model”;  

  9.     Query query=session.createQuery(hql);  

  10.     List<Object[]> prsList=query.list();  

  11.                for(){  

  12.                }                 

  13.     //…  

  14. }  

  15.       

  16.    //采用对象进行 保存 查询的字段(要添加 对应字段的构造方法)  

  17.     public void testQueryDeptName(){  

  18.     String hql=”select new Dapt(model.deptName,model.createDate) from Dept as model”;  

  19.     Query query=session.createQuery(hql);  

  20.     List<Dept> deptList=query.list();  

  21.                for(Dept d:deptList){  

  22.                   

  23.                   d.setDeptName(”test”);  

  24.                   session.saveOrUpdate(dept);  

  25.                }                 

  26.     //…  

  27. }  

  28.   

  29.       

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

  31.   

  32. public void testSaveDept(){  

  33.     Transction  tr=session.beginTransactino();  

  34.     String hql=”select new Dept(model.deptName,model.createDate) from Dept as model”;  

  35.     Query query=session.createQuery();  

  36.     List<Dept> deptList=query.list();  

  37.     for(Dept dept:deptList){  

  38.         System.out.println(dept.deptName);  

  39.         dept.setDetpName(”test”);  

  40.         session.saveOrUpdate(dept);  

  41.     }  

  42.     tr.commit();  

  43.       // 最后 根本就没有更新 而是 在数据库中 插入 新的记录  

  44. }  




5.使用函数 
Java代码   收藏代码


  1. public void testQuyeryFunction(){  

  2.         String hql=”select count(*),min(model.createDate) from Dept as model”;  

  3.         Query query=session.createQuery(hql);  

  4.         List<Object[]> paramsList=query.list();  

  5.         for(){  

  6.               

  7.         }  

  8.         //…  

  9.     }  




6.分组 与 排序 
Java代码   收藏代码


  1. //排序  

  2. public void testQueryOrderBy(){  

  3.         String hql=”from Dept as mode order by   model.createDate,model.deptName desc”;  

  4.         Query query=session.createQuery();  

  5.         List<Dept> deptList=query.list();  

  6.         for(){}  

  7.         //  

  8.           

  9.     }  

  10.   

  11. //分组 并且 使用  having 筛选  

  12. public void testQueryGroupBy(){  

  13.         String hql=”select count(model),model.deptName from Dept as model group by model.deptName having count(model)>1”;  

  14.         Query query=session.createQuery();  

  15.         List<Object[]> list=query.list();  

  16.         //…  

  17.     }  




7.查询单个对象 
Java代码   收藏代码


  1. public void testQueryUn(){  

  2.         String hql=”select model.deptName from Dept as model where model.deptId=2”;  

  3.         Query query=session.createQuery(hql);  

  4.         query.setMaxResults(1);  

  5.         String deptName=(String)query.uniqueResult();  

  6.         System.out.println(deptNamae);  

  7.     }  





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

1.使用 “:”加参数名 绑定参数 
Java代码   收藏代码


  1. public void  testQueryByParamsName(){  

  2.            //使用  ”:参数名” 来传递参数  

  3.     String hql=”from Dept as model where   

  4. odel.deptName=:deptName and model.createDate=:createDate”;  

  5.   

  6.     Query query=session.createQuery(hql);  

  7.     query.setString(”deptName”,“test”);  

  8.     query.setString(”ceateDate”,“2000-02-10”);  

  9.     List<Dept> deptList=query.list();  

  10.     for(){}  

  11.       

  12.     //…  

  13.       

  14. }  




2.使用 “?” 按照位置来绑定参数 
Java代码   收藏代码


  1. public void testQueryByParamsID(){  

  2.     String hql=”from Dept as model where model.deptName=? and model.createDate=?”;  

  3.     Query query=session.createQuery(hql);  

  4.     query.setString(0,“test”);  

  5.     query.setString(1,“2000-02-02”);  

  6.     List<Dept> list=query.list();  

  7.     for(){}  

  8.     //..  

  9. }  




3.采用setEntity() 将参数和一个持久化对象进行绑定 
Java代码   收藏代码


  1. public void testQueryByDept(){  

  2.         Dept dept=(Dept)Session.get(Dept.clas,new Integer(2));  

  3.         String hql=”select Employee  as model where model.dept=?”  

  4.         Query query=session.createQuery(hql);  

  5.         query.setEntity(0,dept);  

  6.         List<Employee> empList=query.list();  

  7.         for(){}  

  8.         //..  

  9.           

  10.           

  11.     }  




4.setParameter() 用于绑定任意类型的参数 
Java代码   收藏代码


  1. public void testQueryBySetParams(){  

  2.         String hql=”from Dept as model where model.deptName=?”;  

  3.         Query query=session.createQuery(hql);  

  4.         query.setParameter(0,“test”);  

  5.         List<Dept> deptList=query.list();  

  6.         for(){}  

  7.         //..  

  8.     }  




5.setProperties() 将一个参数名 于一个对象的属性值绑定 
Java代码   收藏代码


  1. public void testQueryBySetPro(){  

  2.         Dept deptNew=new  Dept();  

  3.         deptNew.setDeptName(”test”);  

  4.           

  5.         String hql=”from Dept as model where model.deptName=:deptName”;  

  6.         Query query=session.createQuery();  

  7.         query.setProperties(deptNew);  

  8.         List<Dept> deptList=query.list();  

  9.         for(){  

  10.               

  11.         }  

  12.         //..  

  13.           

  14.     }  




10. 联合查询 
left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录 
right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录
inner join(等值连接) 只返回两个表中联结字段相等的行

hql中join后跟的是主表的外联属性名,如:from Cat as cat     inner join fetch cat.mate    left join cat.kittens
(一个fetch连接通常不需要被指定别名, 因为相关联的对象不应当被用在 where 子句 (或其它任何子句)中。同时,相关联的对象 并不在查询的结果中直接返回,但可以通过他们的父对象来访问到他们)

inner join 
Java代码   收藏代码


  1. public void testQueryInnerJoin(){  

  2.         String hql=”from Dept as model inner join model1.employees as model2”;  

  3.         Query query=session.createQuery(hql);  

  4.         List<Object[]> objList=query.list();  

  5.         for(Object[] obj:objList){  

  6.             Dept dept=(Dept)obj[0];  

  7.             Employee emp=(Employee)obj[1];  

  8.             System.out.println(”xxxx”);  

  9.         }  

  10.     }  




left join 
Java代码   收藏代码


  1. public void testQueryLeftJoin(){  

  2.         String hql=”from Dept as model left join model1.employees as model2”;  

  3.         Query query=session.createQuery(hql);  

  4.         List<Object[]> objList=query.list();  

  5.         for(Object[] obj:objList){  

  6.             Dept dept=(Dept)obj[0];  

  7.             Employee emp=(Employee)obj[1]; //有可能为空 所以需要判断  

  8.             if(mep!=null){  

  9.                 System.out.println(”xxxx”);  

  10.             }else{  

  11.                 System.out.println(null);  

  12.             }  

  13.             System.out.println(dept.getDeptName());  

  14.         }  

  15.     }  




right join 
Java代码   收藏代码


  1. public void testQueryRightJoin(){  

  2.     String hql=”from Dept as model right join model1.employees as model2”;  

  3.     Query query=session.createQuery(hql);  

  4.     List<Object[]> objList=query.list();  

  5.     for(Object[] obj:objList){  

  6.         Dept dept=(Dept)obj[0];  

  7.         Employee emp=(Employee)obj[1]; //有可能为空 所以需要判断  

  8.         if(dept!=null){  

  9.             System.out.println(dept.getDeptName());  

  10.         }else{  

  11.             System.out.println(null);  

  12.         }  

  13.         System.out.println(”dd”+emp.getEmployeeName());  

  14.     }  

  15. }  




11.子查询 
Java代码   收藏代码


  1. public void testQueryChild(){  

  2.     String hql=”from Dept as model where (select count(*) from model.employee) >2”;  

  3.     Query query=session.createQuery(hql);  

  4.     List<Dept> objList=query.list();  

  5.     for(){}  

  6.     //..  

  7. }  




12 Criteria 查询 
释义:通过面向对象的设计将数据查询条件封装在一个对象 
Java代码   收藏代码


  1. //无条件  

  2. public void testQueryDept(){  

  3.         Criteria criteria=session.createCriteria(Dept.class);  

  4.         List<Dept> deptList=criteria.list();  

  5.         for(){}  

  6.         //..  

  7.     }  

  8.   

  9. //添加条件  

  10. public void testQueryDeptByName(){  

  11.         Criteria criteria=session.createCriteria(Dept.class);  

  12.         criteria.add(Expression.eq(”deptName”“人事部”));  

  13.         List<Dept> deptList=criteria.list();  

  14.         for(){}  

  15.         //..  

  16.     }  




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 

Java代码   收藏代码


  1. public void  testQueryDeptByNameRe(){  

  2.         Criteria  criteria=session.createCriteria(Dept.class);  

  3.         criteria.add(Restrictions.eq(”deptName”“人事部”));  

  4.         List<Dept> deptList=criteria.list();  

  5.         for(){}  

  6.         //..  

  7.           

  8.     }  




Criteria中限定返回的行数 
Java代码   收藏代码


  1. public void testQueryDept(){  

  2.         Criteria criteria=session.createCriteria(Dept.class);  

  3.         criteria.setFirstResult(2);  

  4.         criteria.setMaxResults(2);  

  5.         List<Dept> deptList=criteria.list();  

  6.         for(){}  

  7.         //..  

  8.     }  




Criteria排序 
Java代码   收藏代码


  1. public void testQueryDept(){  

  2.         Criteria criteria=session.createCriteria(Dept.class);  

  3.         criteria.addOrder(Order.asc(”createDate”));  

  4.         List<Dept> deptList=criteria.list();  

  5.         for(){}  

  6.         //..  

  7.     }  





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值