`
nvry
  • 浏览: 319667 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Hibernate Hql查询

阅读更多

在HQL中关键字不区分大小写,但是属性和类名区分大小写,下面介绍各种类型的Hibernate的HQL查询。
1、Hibernate HQL查询:简单属性查询

* 单一属性查询,返回结果集属性列表,元素类型和实体类中相应的属性类型一致

* 多个属性查询,返回的集合元素是对象数组,数组元素的类型和对应的属性在实体类中的类型一致
数组的长度取决与select中属性的个数

* 如果认为返回数组不够对象化,可以采用HQL动态实例化Student对象

2、Hibernate HQL查询:实体对象查询

* N + 1问题,在默认情况下,使用query.iterate查询,有可以能出现N+1问题,所谓的N+1是在查询的时候发出了N+1条sql语句,1: 首先发出一条查询对象id列表的sql,N: 根据id列表到缓存中查询,如果缓存中不存在与之匹配的数据,那么会根据id发出相应的sql语句

* list和iterate的区别?

* list每次都会发出sql语句,list会向缓存中放入数据,而不利用缓存中的数据

* iterate:在默认情况下iterate利用缓存数据,但如果缓存中不存在数据有可以能出现N+1问题

3、Hibernate HQL查询:条件查询

* 可以采用拼字符串的方式传递参数

Java代码:

  1. List students = session.createQuery
  2. ("select s.id, s.name from Student s where s.name like '%1%'").list();    

* 可以采用 ?来传递参数(索引从0开始)

Java代码:

  1. List students = session.createQuery
  2. ("select s.id, s.name from Student s where s.name like ?").setParameter(0"%1%").list();      
  3. //可以使用?方式传递参数      
  4. //参数的索引从0开始      
  5. //传递的参数值,不用单引号引起来      
  6. //注意方法链编程    

* 可以采用 :参数名 来传递参数

Java代码:

  1. List students = session.createQuery  
  2. ("select s.id, s.name from Student s where s.name like :myname").
  3. setParameter("myname""%1%").list();    

* 如果传递多个参数,可以采用setParamterList方法

Java代码:

  1. List students = session.createQuery
  2. ("select s.id, s.name from Student s where s.id in(:myids)").
  3. setParameterList("myids"new Object[]{12345}).list();    

* 在HQL中可以使用数据库的函数,如:date_format

Java代码:

  1. List students = session.createQuery
  2. ("select s.id, s.name from Student s where date_format(s.createTime, '%Y-%m')=?").
  3. setParameter(0"2008-02").list();      
  4. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");      
  5.          
  6.    //查询2008-01-10到2008-02-15创建的学生      
  7.     List students = session.createQuery
  8. ("select s.id, s.name from Student s where s.createTime between ? and ?")      
  9.           .setParameter(0, sdf.parse("2008-01-10 00:00:00"))      
  10.           .setParameter(1, sdf.parse("2008-02-15 23:59:59"))      
  11.                 .list();     

4、Hibernate HQL查询:直接使用sql进行查询

Java代码:

  1. List students = session.createSQLQuery("select * from t_student").list();    


不会返回对象,而是所有属性!  


5、Hibernate HQL查询:分页查询

* setFirstResult(),从0开始

* setMaxResults,每页显示多少条数据

Java代码:

  1. List students = session.createQuery("from Student")      
  2.           .setFirstResult(1)      
  3.           .setMaxResults(2)      
  4.           .list();    

6、Hibernate HQL查询:对象导航查询,在HQL中采用 . 进行导航

7、Hibernate HQL查询:连接查询

* 内连

Sql代码:

  1. SELECT s.name, c.name FROM Student s (inner) join s.classes c    

* 外连接(左连接/右连接)

Sql代码:

  1. SELECT s.name, c.name FROM Student s left join s.classes c    

8、Hibernate HQL查询:统计查询

Java代码:

  1. List students =session.createQuery
  2. ("select c.name, count(s) from Student s join s.classes c " 
  3. +"group by c.name order by c.name").list();      
  4. for (Iterator iter=students.iterator(); iter.hasNext();) {      
  5.      Object[] obj = (Object[])iter.next();      
  6.      System.out.println(obj[0] + ", " + obj[1]);      
  7. }    

9、DML风格的操作(尽量少用,因为和缓存不同步)

Java代码:

  1. session.createQuery  
  2. ("update Student s set s.name=? where s.id < ?")      
  3.                      .setParameter(0"李四")      
  4.                      .setParameter(15)      
  5.                      .executeUpdate();    

应当尽量少用,因为和缓存不同步,也就是说,假如在执行上面的语句之前,已经把student封装成一个list曾经拿了出来,再执行上面的语句对 student中的表进行数据更新,然后再list Student表,则此时的list是从缓存中取的数据,而不是从表中找到的数据,也就是说,list拿到的是update前的数据,所以造成了这种不同步,所以这种风格尽量少用。

从这个方面也可以看得出Hibernate并不适用于聚集性,统计,大量批量的更新,删除等操作。

分享到:
评论

相关推荐

    Hibernate hql查询语法总结

    《Hibernate HQL查询语法详解》 Hibernate,作为Java领域中广泛应用的对象关系映射(ORM)框架,极大地简化了数据库操作。其内置的HQL(Hibernate Query Language)是一种面向对象的查询语言,它允许开发者以类和...

    Hibernate HQL查询 分页查询 模糊查询.docx

    这里的关键点在于使用`createQuery`方法创建了一个HQL查询对象,并通过`setString`方法设置参数值,最后通过`list`方法执行查询并获取结果列表。 #### 三、分页查询 分页查询在处理大量数据时非常有用,可以有效地...

    Hibernate HQL查询语句总结.docx

    Hibernate HQL 查询语句总结 Hibernate HQL 查询语句是 Hibernate 框架中的一种查询语言,它提供了更加丰富的和灵活的查询特性,具有类似标准 SQL 语句的查询方式,同时也提供了更加面向对象的封装。以下是 ...

    Hibernate HQL查询.docx

    ### Hibernate HQL 查询详解 #### 一、HQL 概述 Hibernate 提供了一种非常强大的查询语言——HQL(Hibernate Query Language),它在语法上与 SQL 类似但功能更为强大,因为它支持面向对象的特性,例如继承、多态性...

    hibernate HQL 查询

    hibernate HQL 查询教程 管理 Session ThreadLocal 接口的使用

    hibernateHQL关联查询

    ### Hibernate HQL 关联查询详解 #### 一、引言 在进行数据库操作时,关联查询是必不可少的一部分,尤其在处理复杂的数据结构时更是如此。Hibernate作为一种流行的Java持久层框架,提供了强大的对象关系映射(ORM...

    Hibernate hql查询

    **Hibernate HQL查询** Hibernate Query Language(HQL)是Hibernate框架提供的一种面向对象的查询语言,它是基于Java的,但其语法与SQL类似,用于在Java应用中操作对象。HQL允许开发者用类名和属性名而不是表名和...

    HibernateHQL.zip_更新

    HQL查询是Hibernate的核心功能之一,它能让我们以类和对象的方式来查询数据。基本语法如下: ```java Query query = session.createQuery("from EntityName where property = ?"); query.setParameter(0, value); ...

    Hibernate-HQL-查询-Query资料

    本资料主要涵盖了Hibernate HQL查询的基本概念、语法以及实际应用。 1. **HQL概述** - HQL是Hibernate提供的面向对象的查询语言,与SQL类似,但更加面向对象,将数据库表映射为Java类,表中的行映射为类的对象。 ...

    Hibernate HQL基础练习小列子+数据库文件

    Hibernate HQL基础练习小列子+数据库

    Hibernate查询语言HQL.PPT

    Hibernate 查询语言 HQL Hibernate 查询语言 HQL 是一种面向对象的查询语言,用于检索对象。它提供了灵活多样的查询机制,包括导航对象图、通过标识符检索、使用 HQL 检索对象、使用 Hibernate 条件 API 和使用本地...

    hibernate hql各类查询范例

    以上内容涉及了使用 HQL 和 DetachedCriteria 进行查询、参数化查询、执行更新操作以及简单的统计查询等常见的 Hibernate 操作。这些知识点对于理解和掌握 Hibernate 框架的基本使用至关重要,同时也是开发基于 ...

    hibernateHQL基本查询

    ### Hibernate HQL 基本查询详解 #### 一、HQL 概述 HQL (Hibernate Query Language) 是一种面向对象的查询语言,由 Hibernate 官方提供,用于简化数据库查询过程。与传统的 JDBC 方式相比,使用 HQL 进行数据库...

    hibernate 查询?Hibernate的HQL查询

    【标题】:深入理解Hibernate的查询机制:HQL查询 【描述】:在ORM框架Hibernate中,数据查询和检索是一个核心功能,它提供了多种查询方式,包括标准化对象查询(Criteria Query)、Hibernate查询语言(HQL)和原生...

    Hibernate_HQL.rar_hibernate HQL_hibernate hql src

    对hibernate的hql进行了详尽的讲解

    Hibernate-HQL.rar_HQL_hibernate hql

    在Hibernate中,通过Session对象的createQuery或createSQLQuery方法创建HQL查询,然后调用list、uniqueResult、scroll等方法执行查询。执行过程中,Hibernate会自动进行类型转换和结果集的封装,极大地降低了开发...

    Hibernate HQL.txt

    下面是一个简单的Java程序示例,展示了如何在Java中使用Hibernate框架执行HQL查询: ```java import java.util.List; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate....

    HibernateHql综合测试小程序

    本程序“HibernateHql综合测试小程序”是针对Hibernate中的HQL(Hibernate Query Language)进行的一系列功能测试,涵盖了二十多种不同的HQL语句,旨在帮助开发者深入理解和熟练运用Hibernate的查询能力。...

    Hibernate HQL 结合 velocity

    1. **执行HQL查询**:在Java代码中,使用`Session`对象的`createQuery()`或`createNativeQuery()`方法创建HQL查询,然后调用`list()`或`uniqueResult()`等方法获取查询结果。 2. **处理查询结果**:将查询结果转换...

Global site tag (gtag.js) - Google Analytics