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

朴灿烈づ我的快乐病毒、 2024-02-17 18:18 220阅读 0赞

1导航对象图检索方式

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

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

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

customer.getEmps.size()

2 OID检索方式

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

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

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

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

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

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

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

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

使用**HQL**查询员工姓刘的

List<?> customers = session.createQuery(

“from Emp e where e.ename like ‘刘%’”)

.list();

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

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

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

由Hibernate 自动产生SQL查询语句

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

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

使用QBL查询员工姓刘的

List list= session.createCriteria(Emp.class)

.add(Restrictions.like(“ename”,”刘%”))

.list();

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

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

Emp emp1=new Emp();

template.setName(“翠花”);

List emps= session.createCriteria(Emp.class)

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

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

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

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

7 命名SQL检索方式

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


select {e.*} from emp e where e.job=?


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

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

总结:

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

其中HQL与QBC的区别:







































比较方面

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 条评论,220人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Hibernate查询缓存

     在hibernate的使用中,大家多数时间都在讨论一级缓存和二级缓存,而往往忽略了查询缓存。其实hibernate的查询缓存在使用过程中也起着同样重要的作用。hibernat