Hibernate 查询HQL,QBC 及命名HQL,SQL查询

1导航对象图检索方式

 根据己经加载的对象,导航到其他对象。

        如:   Dept dept= session.get(Dept.class ,10 ); // 持久Dept

                  //由于dept关联了emps集合,hibernate就会自动生成SQL语句去检索 Emp的数据

                  customer.getEmps.size()


OID检索方式

按照对象的OID来检索对象。

    根据id检索 session提供 get/load 方法

 

HQL检索方式  使用面向对象的HQL查询语言。

采用HQL检索方式时,在应用程序中需要定义基于字符串形式的HQL查询语句。

HQL(Hibernate QueryLanguage) 是面向对象的查询语言,它和SQL查询语言有些相似。

在Hibernate提供的各种检索方式中,HQL是使用最广的一种检索方式。它具有如下功能:

  • 在查询语句中设定各种查询条件。
  • 支持投影查询,即仅检索出对象的部分属性。
  • 支持分页查询。
  • 支持连接查询。
  • 支持分组查询,允许使用havinggroup by关键宇。
  • 提供内置聚集函数,如sum()min()max()
  • 能够调用用户定义的SQL函数。
  • 支持子查询,即嵌入式查询。
  • 支持动态绑定参数。

Session类的find()方法与Query 接口都支持HQL 检索方式。这两者的区别在于,前者只是执行一些简单HQL 查询语句的便捷方法,它不具布动态绑定参数的功能。

使用HQL查询员工姓刘的

List<?> customers = session.createQuery(

"from Emp e where e.ename like '%'")

.list();

 

QBC检索方式  {根据面向对象的Criteria对象检索}

使用QBC(QueryBy Criteria)API来检索对象。

Criteria查询采用面向对象方式封装查询条件,又称为对象查询

由Hibernate 自动产生SQL查询语句

QBC API提供了检索对象的另一种方式,它主要由Criteria 接口、Criterion 接口和Expression 类组成。

支持在运行时动态生成查询语句。

使用QBL查询员工姓刘的

List<Emp> list= session.createCriteria(Emp.class)

.add(Restrictions.like("ename","%"))

.list();


5 QBE ( Query By Example ) 检索方式,它是QBC的子功能。

QBE允许先创建一个对象样板,然后检索出所有和这个样板相同的对象。

Emp emp1=new Emp();

template.setName("翠花");

List<Emp> emps= session.createCriteria(Emp.class)

.add(Example.create(emp1)).list();

 

 

本地SQL检索方式  {根据SQL语句检索}  

使用本地数据库的SQL查询语句。

          // 1)获得会话对象
Session session = HibernateUtil.currentSession();
String sql = "select {e.*} from emp e";
List<Object> list = session.createSQLQuery(sql)
.addEntity("e",Emp.class)  //必须要指定实体类=》emp表名
 .list();


7 命名SQL检索方式

(1)首先必须在对应的实体类配置文件中配置

    <!--  命名SQL查询 -->
    <sql-query name="findByJob">
     select {e.*} from emp e where e.job=?
     <return alias="e" class="com.hlx.entity.Emp"/>
    </sql-query>


(2)其次再调用这个配置的名称findByJob

// 1)获得会话对象
Session session = HibernateUtil.currentSession();
List<Object> list = session.getNamedQuery("findByJob")
            .setParameter(0, "CLERK")
            .list();


总结:

     一般开发中第3种、第4种使用最多,但Hibernate框架本身不适合特别复杂数据表关系进行查询,在实际开发中如果查询特别复杂会直接编写SQL语句


 其中HQLQBC的区别:

比较方面

HQL检索方式

QBC检索方式

可读性

SQL查询语言比较接近,比较容易读懂

QBC把查询语句肢解为一组Criterion实例。可读性差。

功能

功能最强大,支持各种各样的查询。

没有HQL的功能强大,例如不支持报表查询和子查询,而且对连接查询也做了很多限制。

查询语句形式

应用程序必须提供基于字符串形式的HQL查询语句。

QBC检索方式封装了基于字符串形式的查询语句,提供了更加面向对象的接口。

何时被解析

HQL查询语句只有在运行时才会被解析

OBC在编译时就能被编译,因此更加容易排错

可扩展性

不具有扩展性

允许用户扩展Criterion接口

对动态查询语句的支持

尽管支持生成动态查询语句,但是编程很麻烦

适合于生成动态查询语句

对连接查询的支持

指定的连接查询类型

HQL语法

QBC语法

适用范围

内连接

inner join或者join

Criteria.createAlias()

适用于有关联关系的持久化类,并且在映射文件中对这种关联关系作了映射。

迫切内连接

inner join fetch或者join fetch

不支持

 

隐式内连接

 

不支持

 

左外连接

left outer join或者left join

不支持

 

迫切左外连接

left outer join fetch或者left join fetch

FetchMode.EAGER

 

右外连接

right outer join或者right join

不支持

 

交叉连接

ClassA,ClassB

不支持

适用于不存在关联关系的持久化类


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值