博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HQL:实用技术
阅读量:7095 次
发布时间:2019-06-28

本文共 3241 字,大约阅读时间需要 10 分钟。

hot3.png

HQL:实用技术

一:使用HQL语句

  1. Hibernate支持三种查询方式:
    (1.)HQL查询,Criteriac查询及原生SQL(Native SQL)查询。HQL(Hibernate Query Language,Hibernate查询语言)是一种面向对象的查询语言,其中没有表和字段的概念,只有类对象,属性的概念。

二:编写HQL语句

  1. From子句
    Select子句
    Where子句
    使用表达式
    Order by 子句: 示例:升序排序:from Emp order by hireDate salary desc;
  2. 执行HQL语句的步骤:
    获取Session 对象
    编写HQL语句
    创建Query对象:Query query =session.oreateQuery(?); 执行查询,得到查询结果

三:在SQL语句中绑定参数

  1. 按位置绑定参数
    Query query=session.createQuery(“from Emp where job=? And salary>?”);
  2. 按参数名绑定
    Query query=session.createQuery(“from Emp where job=:empJob and salary>:empSalary”);
  3. 绑定各种类型的参数: Query接口提供
    (1.)setBoolean();
    (2.)setByte();
    (3.)setDouble();
    (4.)setDate();
    (5.)setString();
    (6.)setParameter();用来绑定任意类型。
    (7.)setProperties();用来绑定参数与一个对象的属性值。
    4.使用uniqueResult()方法获取唯一结果

四:分页和投影

  1. 实现数据分页查询
    通过Query接口的setFirstResult(int firstResult)方法和setMaxResults(int maxResults)方法实现。 分别返回最大和最小记录。
  2. 使用投影查询
    *每条查询结果仅包含一个结果列:
    Public List<String>findAllNames(){ String hql=”select deptName from Dept”; Return currentSession().createQuery(?).list();//省略其它内容 }

*查询每条结果包含不止一个结果列:

Public List<String>findAllNames(){ String hql=”select deptNo,deptName from Dept”; Return currentSession().createQuery(?).list();//省略其它内容 }

*将每条查询结果通过构造方法封装成对象

Public class DeptDao extends BaseDao{ //要求Dept类中有Dept(Byte deptNo,String deptName)和Dept()构造方法 Public List<Dept> findAllDeptList(){ String hql=”select new Dept(deptNo,deptName)from Dept”; Return currentSession().createQuery(?).list();//省略其它内容 } }

HQL连接查询和注解

一:HQL连接查询

各种连接查询:

内连接:inner join或join

From Entity inner [inner] join [fetch] Entity.property;

左外连接:left outer join或left join

From Entity left[outer] join [fetch] Entity.property;

迫切左外连接:left outer join fetch或left join fetch

右外连接:right outer join或right join

迫切连接:inner join fetch或join fetch

注:迫切连接要使用对象连接,不然的话会出错。

等值连接:     From  Dept d,Emp p where d=e.dept;

聚合函数 select count(*),sum(sal),min(sal),max(sal),avg(sal)from Emp;

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

for (Object[] o:list) {

System.out.println("总:"+o[0]+"和:"+o[1]+"最小值:"+o[2]+"最大值:"+o[3]+"平均数:"+o[4]);

}//省略其它代码

按职位统计员工个数:

select e.job,count(*) from Emp e group by e.job

统计每个部门下的员工个数并且大于2的显示输出:

select e.job,count() from Emp e group by e.job having count()>2;

子查询关键字: all:子查询返回所有记录。

any:子查询返回的任意的一条记录。

some:与“any”意思相同

in:与“=any意思相同”

exists:子查询语句至少返回一条记录。

操作集合函数或属性。 size()或size:获取集合中的元素数目。

minIndex()或minIndex:对于建立索引的集合,获取最小的索引

maxIndex()或maxIndex:对于建立索引的集合,获取最大的索引。

minElement()或minElement:对于包含基本类型的元素集合,获得集合中取值最小的元素。

maxElement()或maxElement: 对于包含基本类型的元素集合,获得集合中取值最大的元素。

Elements();获取集合中的所有元素。

二:查询性能优化

hibernate查询优化策略:

(1.)使用迫切左外连接,或迫切连接查询策略,配置二级缓存和查询等方式,减少select语句数目,降低访问数据库的频率。

(2.)使用延迟加载等方式避免加载多余不需要访问的数据。

(3.)使用Query接口的iterate()方法减少select语句的字段,降低访问数据库的数据量,并结合缓存等机制减少数据库的访问次数,提高查询效率。

2.HQL优化:

(1.)避免使用or操作的不当。

(2.)避免使用not。

(3.)避免使用like的特殊形式。

(4.)避免使用having子句。

(5.)避免使用distinct。

(6.)索引在以下情况下失效,使用时注意。

对字段使用函数,该字段的索引将不起作用。如:substring(aa,1,2)=’xxx’               对字段进行计算,该字段的索引将不起作用。如:price+10。

三:注解

使用hibernate注解的步骤如下:

(1.)使用注解配置持久化类及对象的关联关系。

(2.)在hibernate配置文件(hibernate.cfg.xml)中声明持久化类,语法如下:

配置持久化类的常用注解: :将一个类声明为持久化类。

@Table:为持久化映射指定表。

@Id:声明了持久化类的表示属性。

@GeneratedValue:定义表示属性的生成策略。

@UniqueConstraint:定义表的唯一约束。

@Lob:表示属性将被持久化为BLOD或者CLOD类型。

@Column:将属性映射到数据库字段。

@Transient:指定可以忽略的属性,不用持久化到数据库。

转载于:https://my.oschina.net/u/3711263/blog/1583212

你可能感兴趣的文章
Spring 执行 sql 脚本(文件)
查看>>
canvas绘制多张图其中有空白或绘制不成功的问题
查看>>
quicklink解析
查看>>
webpack4系列教程(九):开发环境和生产环境
查看>>
GraphQL 科普 前端向
查看>>
前端基本功-常见概念(一)
查看>>
史上最全SQL优化方案
查看>>
阿里云时空数据库引擎HBase Ganos上线,场景、功能、优势全解析
查看>>
Promise实现思路的个人理解
查看>>
基于文件系统实现可追加的数据集市
查看>>
Python2.x与3.x版本区别
查看>>
pipenv与virtualenv
查看>>
Python 送你一棵圣诞树
查看>>
Express 文档(express())
查看>>
算法复杂度分析
查看>>
WEB站点性能优化实践
查看>>
C++ 学习笔记之——输入和输出
查看>>
前端调用ocx将ocx封装为cab包整体流程
查看>>
接口异常状态统一处理方案:优先业务端处理,再按需统一处理。
查看>>
Go模块简明教程(Go语言依赖包管理工具)
查看>>