• HQL:实用技术


    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;

    1. 执行HQL语句的步骤:

    获取Session 对象

    编写HQL语句

    创建Query对象:Query query =session.oreateQuery(?);

    执行查询,得到查询结果

    三:在SQL语句中绑定参数

    1. 按位置绑定参数

    Query query=session.createQuery(“from Emp where job=? And salary>?”);

    1. 按参数名绑定

    Query query=session.createQuery(“from Emp where job=:empJob and salary>:empSalary”);

    1. 绑定各种类型的参数: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)方法实现。分别返回最大和最小记录。

    1. 使用投影查询

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

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

    1. 各种连接查询:

    内连接: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;

    1. 聚合函数

    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;

    1. 子查询关键字:

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

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

    some:与“any”意思相同

    in:与“=any意思相同”

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

    1. 操作集合函数或属性。

    size()或size:获取集合中的元素数目。

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

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

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

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

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

    二:查询性能优化

    1. 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。

    三:注解

    1. 使用hibernate注解的步骤如下:

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

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

                        <mapping class=”持久化类完整限定名”>

    1. 配置持久化类的常用注解:

    @Entity:将一个类声明为持久化类。

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

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

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

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

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

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

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

            

  • 相关阅读:
    poj 3111 卖珠宝问题 最大化平均值
    如何在b站上传高码率视频
    AC自动机总结
    NOIP2018 旅行
    NOI2008 假面舞会 DFS
    鸽子的记录
    Unity学习笔记
    LuoguP1196 [NOI2002]银河英雄传说 并查集
    Luogu1801 黑匣子 堆
    Luogu P1321 单词覆盖还原 字符串
  • 原文地址:https://www.cnblogs.com/dkz1/p/7932876.html
Copyright © 2020-2023  润新知