Hibernate 的HQL,QBC 查询语言
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
- odel.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(){}
- //..
- }
Hibernate 的HQL,QBC 查询语言的更多相关文章
- Hibernate之HQL查询
一.Hibernate 提供了以下几种检索对象的方式: 导航对象图检索方式: 根据已经加载的对象导航到其他对象 OID 检索方式: 按照对象的 OID 来检索对象 HQL 检索方式:使用面向对象的 H ...
- Hibernate之HQL介绍
Hibernate中提供了多种检索对象的方式,主要包括以下种类: 导航对象图检索方式:根据已经加载的对象导航到其他对象 OID检索方式:根据对象的OID来检索对象 HQL检索方式:使用面向对象的HQL ...
- Hibernate五 HQL查询
HQL查询一 介绍1.HQL:Hibernate Query Language,是一种完全面向对象的查询语言.使用Hibernate有多重查询方式可供选择:hibernate的HQL查询,也可以使用条 ...
- hibernate的hql查询
1.概念介绍 1.Query是Hibernate的查询接口,用于从数据存储源查询对象及控制执行查询的过程,Query包装了一个HQL查询语句. 2.HQL是Hibernate Query Langua ...
- Hibernate 的hql查询简介【申明:来源于网络】
Hibernate 的hql查询简介[申明:来源于网络] Hibernate 的hql查询简介:http://blog.csdn.net/leaf_130/article/details/539329 ...
- Hibernate的hql语句save,update方法不执行
Hibernate的hql语句save,update方法不执行 可能出现的原因问题: 未进行事务管理 需要进行xml事务配置或者注解方式的事务配置
- Hibernate学习---第九节:Hibernate之hql
一.Hql 入门 1.实体类: package learn.hibernate.bean; import java.util.Date; import java.util.HashSet; impor ...
- Java_Web三大框架之Hibernate+jsp+HQL分页查询
分页查询无处不在.使用Hibernate+jsp+HQL进行分页查询. 第一步:编写房屋实体类和House.hbm.xml映射. /* * 房屋实体类 */ public class House { ...
- Hibernate 查询方式(HQL/QBC/QBE)汇总
作为老牌的 ORM 框架,Hibernate 在推动数据库持久化层所做出的贡献有目共睹. 它所提供的数据查询方式也越来越丰富,从 SQL 到自创的 HQL,再到面向对象的标准化查询. 虽然查询方式有点 ...
随机推荐
- linux 3389连接工具Rdesktop
简单使用 工作机换成战斗机了,改用ubuntu,原来的windows7上东西笔记多,还不想重装.用rdesktop来远程连接windows: sudo apt-get install rdesktop ...
- nginx 伪静态rewrite
location正则写法 一个示例: location = / { # 精确匹配 / ,主机名后面不能带任何字符串 [ configuration A ] } location / { # 因为所 ...
- 利用Python 发送邮件
概要 我们都知道SMTP(简单邮件传输协议),是一组用于从原地址到目的地址传输邮件的规范,通过它来控制邮件的中转方式.SMTP规定电子邮件应该如何格式化.如何加密,以及如何在邮件服务器之间传递.SMT ...
- gpio子系统和pinctrl子系统(中)
pinctrl子系统核心实现分析 pinctrl子系统的内容在drivers/pinctrl文件夹下,主要文件有(建议先看看pinctrl内核文档Documentation/pinctrl.txt): ...
- 快速排序算法的c++实现
很早以前看过快排算法觉得自己掌握了,,课今天用的时候发现老出错,认真想想发现自己一直搞错了... 下面先说一下我的想法: 首先,快排的思想就是 从数列中挑出一个元素,称为 "基准" ...
- CSS3 icon font
大家都知道现在各个浏览器都支持CSS3的自定义字体(@font-face),包括IE6都支持,只是各自对字体文件格式的支持不太一样.那么对于网站中用到的各种icon,我们就可以尝试使用font来实现, ...
- HIbernate学习笔记2 之 主键生成方式
一.hibernate主键生成方式: 1.常用方式:mysql:自增长生成主键(identity) <generator class="identity"> </ ...
- 阿里云轻量应用服务器——配置MySQL远程连接(踩坑,LAMP+CentOS)
说在前面 本文讲解清晰,从0开始 如不能用Navicat等数据库软件远程登陆,请先检查:安全>防火墙中 是否添加了MYSQL的3306端口(ECS服务器请检查 安全组)如未添加,先点右上角“添加 ...
- Mayavi入门
环境,win7/10 64位, python3.x 1,安装 Mayavi4.6 原装的pip下载奇慢,先更换一下源,豆瓣的更新要比清华的快 首先在window的文件夹窗口输入 : %APPDATA% ...
- MVC - 12.HtmlHelper
1.动态生成URL @Url.Action("Index3","Stu3") @Url.RouteUrl("Default2", new { ...