`

Hibernate查询方式汇总

阅读更多

转帖地址:

(2012-11-03 16:24:35)

 

<!-- 正文开始 -->

Hibernate总的来说共有三种查询方式:HQL、QBC和SQL三种。但是细分可以有如下几种:

一、HQL查询方式

    这一种我最常用,也是最喜欢用的,因为它写起来灵活直观,而且与所熟悉的SQL的语法差不太多。条件查询、分页查询、连接查询、嵌套查询,写起来与SQL语法基本一致,唯一不同的就是把表名换成了类或者对象。其它的,包括一些查询函数(count(),sum()等)、查询条件的设定等,全都跟SQL语法一样。
###注意:

     在hql中关键字不区分大小写,但是属性和类名区分大小写
示例1:

  static void query(String name){
  Session s=null;

  try{

   s=HibernateUtil.getSession();

   //from后面是对象,不是表名

   String hql="from Admin as admin where admin.aname=:name";//使用命名参数,推荐使用,易读。

   Query query=s.createQuery(hql);

   query.setString("name", name);

   List<Admin> list=query.list();


   for(Admin admin:list){

    System.out.println(admin.getAname());
  }

  }finally{

   if(s!=null)

   s.close();
 }
}
######!!!!!!!!!!!!!对于多对一关系查询:
 
String hql = "from Student where Class.className = '二班'";
(Student实体类中含有Class对象的引用。这样相当于两张表的联合查询

示例2(分页查询)
    Query query = session.createQuery("from Customer c
order by c.name asc");
query.setFirstResult(0);
query.setMaxResults(10);
List result = query.list();
    说明:
  
–setFirstResult(int firstResult):设定从哪一个对象开始检索,参数firstResult表示这个对象在查询结果中的索引位置,索引位置的起始值为0。默认情况下,Query和Criteria接口从查询结果中的第一个对象,也就是索引位置为0的对象开始检索。 

    –setMaxResult(int maxResults):设定一次最多检索出的对象数目。默认情况下,Query和Criteria接口检索出查询结果中所有的对象。

 

适用情况:常用方法,比较传统,类似jdbc。缺点:新的查询语言,适用面有限,仅适用于Hibernate框架。

二、QBC(Query By Criteria) 查询方式
  
这种方式比较面向对象方式,重点是有三个描述条件的对象:Restrictions,Order,Projections。使用QBC查询,一般需要以下三个步骤:

   1、 使用Session实例的createCriteria()方法创建Criteria对象
   2、使用工具类Restrictions的方法为Criteria对象设置查询条件,Order工具类的方法设置排序方式,Projections工具类的方法进行统计和分组。
   3、使用Criteria对象的list()方法进行查询并返回结果

Restrictions类的常用方法:

Restrictions类的常用方法:

方法名称
描述
Restrictions.eq 等于
Restrictions.allEq 使用Map,Key/Valu进行多个等于的比对
Restrictions.gt 大于
Restrictions.ge 大于等于
Restrictions.lt 小于
Restrictions.le 小于等于
Restrictions.between 对应SQL的between
Restrictions.like 对应SQL的like
Restrictions.in 对应SQL的in
Restrictions.and and关系
Restrictions.or or关系
Restrictions.sqlRestriction SQL限定查询

Order类的常用方法:

方法名称
描述
Order.asc 升序
Order.desc 降序

Projections类的常用方法

方法名称
描述
Projections.avg 求平均值
Projections.count 统计某属性的数量
Projections.countDistinct 统计某属性不同值的数量
Projections.groupProperty 指定某个属性为分组属性
Projections.max 求最大值
Projections.min 求最小值
Projections.projectionList 创建一个ProjectionList对象
Projections.rowCount 查询结果集中的记录条数
Projections.sum 求某属性的合计

示例:static void cri(String name,String password){

  Session s=null;

  try{

   s=HibernateUtil.getSession();

   Criteria c=s.createCriteria(Admin.class);

   c.add(Restrictions.eq("aname",name));//eq是等于,gt是大于,lt是小于,or是或

   c.add(Restrictions.eq("apassword", password));

   List<Admin> list=c.list();


   for(Admin admin:list){

    System.out.println(admin.getAname());

   }

  }finally{

   if(s!=null)

   s.close();

  }
}

示例2(分页查询)
    Criteria criteria = session.createCriteria(Customer.class);
criteria.addOrder( Order.asc("name") ); //排序方式
criteria.setFirstResult(0);
criteria.setMaxResults(10);
List result = criteria.list()
 
适用情况:面向对象操作,革新了以前的数据库操作方式,易读。缺点:适用面较HQL有限。

三、QBE(Query By Example)例子查询方式
   将一个对象的非空属性作为查询条件进行查询。
 示例:Session session = SessionFactory.getCurrentSession();

  User user = new User();
   user.setName("ijse");


   Transaction ts = session.beginTransaction();

    try {

        Criteria criteria = session.createCriteria(User.class);

        criteria.add(Example.create(user));

      user= (User) criteria.list().get(0);  
 

       session.commit();

   } catch (HibernateException ex) {

       ts.rollBack();

       ex.printStackTrace();

   }

   System.out.println(user.getName());
适用情况:面向对象操作。   缺点:适用面较HQL有限,不推荐。

四、
DetachedCriteria:离线条件查询
   离线查询就是建立一个DetachedCriteria对象,将查询的条件等指定好,然后在session.beginTransaction()后将这个对象传入。通常这个对象可以在表示层建立,然后传入业务层进行查询。
  1、建立DetachedCriteria对象
    DetachedCriteria dc = DetachedCriteria.forClass(User.class);

  int id = 1;

  if (id != 0)

   dc.add(Restrictions.eq("id", id));

  Date age = new Date();

  if (age != null)

   dc.add(Restrictions.le("birthday", age));

  List users = dc(dc);//执行查询

  System.out.println("离线查询返回结果:" + users);
 2、执行查询
   static List dc(DetachedCriteria dc) {
   Session s = HibernateUtil.getSession();

  Criteria c = dc.getExecutableCriteria(s);
  List rs = c.list();


  s.close();
  return rs;
}
适用情况:面向对象操作,分离业务与底层,不需要字段属性摄入到Dao实现层。  缺点:适用面较HQL有限。

五、命名查询
  1、在数据映射元文件中进行配置如下:
 <?xml version="1.0" encoding="utf-8"?>

<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"

"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>

    <class name="com.sy.vo.User" table="user" catalog="news">
   ....
    </class>

    <!-- 命名查询:定义查询条件 -->

    <query name="getUserById">

     <![CDATA[from User where id=:id]]>

    </query>


    <!-- 命名查询中使用sql,不推荐使用,影响跨数据库

    <sql-query name="getUserById2">

     <![CDATA[select * from User where ]]>

    </sql-query> -->


</hibernate-mapping>
  2、在java代码中写入:
  static List namedQuery(int id) {
  Session s = HibernateUtil.getSession();
  Query q = s.getNamedQuery("getUserById");
  q.setInteger("id", id);

  return q.list();
 }
适用情况:万能方法,有点像ibatis轻量级框架的操作,方便维护。  缺点:不面向对象。基于hql和sql,有一定缺陷。

六、SQL查询
   示例:
static List sql() {
 Session s = HibernateUtil.getSession();

  Query q = s.createSQLQuery("select * from user").addEntity(User.class);

  List<User> rs = q.list();


  s.close();

  return rs;
 }
适用情况:不熟悉HQL的朋友,又不打算转数据库平台的朋友,万能方法   缺点:破坏跨平台,不易维护,不面向对象。

七、OID查询方式
   
按照对象的OID来检索对象。Session的get()和load()方法提供了这种功能。如果在应用程序中事先知道了OID,就可以使用这种检索对象的方式。 

 

八、Query.iterator的N+1查询(基于一的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问题

  示例:Query q=session.createQuery(“from UserInfo”);
     Iterator<UserInfo> list=q.iterate();

     While(list.hasNext()) {
    
UserInfo st = (UserInfo) it.next();
     System.out.println(st.getName());
    }
避免N+1查询解决方法:
    1、可以将fetch抓取数据的属性改为“join”,来避免N+1次的查询;
    2、使用二级缓存


九、复查查询(基于二:
QBC的深度查询)
  复合查询就是在原有查询的基础上再进行查询,可以调用Criteria对象的createCriteria()方法在这个Criteria对象的基础上再进行查询。
示例:Session session = SessionFactory.getCurrentSession();

    User user = new User();

    Transaction ts = session.beginTransaction();

    try  {

   Criteria criteria1 = session.createCriteria(Room.class);

   Criteria  criteria2 =criterial.createCriteria("User");

     criteria2.add(Restrictions.eq("name",new String("ijse"));


   user= (User) criteria.list().get(0);

    session.commit();

  } catch (HibernateException ex) {

   ts.rollBack();

  ex.printStackTrace();
 }

  System.out.println(user.getName());
分享到:
评论

相关推荐

    hibernate jar包汇总

    综上所述,Hibernate jar包汇总包含了实现ORM所需的各种组件和库,它们协同工作,为Java开发者提供了一个强大的工具,简化了数据库操作,提高了开发效率。在实际项目中,了解并熟练运用这些知识点,能够有效地管理和...

    Hibernate基础教程汇总

    资源名称:Hibernate基础教程汇总资源目录:【】hibernate【】hibernate_312_中文参考文档【】hibernate乐观锁和悲观锁【】hibernate基础教程【】Hibernate注解详解实体类大全资源截图: 资源太大,传百度网盘了,...

    hibernate知识点汇总

    这篇文章主要汇总了关于 Hibernate 的一些关键知识点,对于准备面试的 IT 专业人士来说非常有用。 1. **持久化**:持久化是将应用程序的数据存储在数据库中,使得数据即使在应用程序关闭后也能长期存在。在 ...

    Hibernate面试题部分汇总集合

    Hibernate面试题部分汇总集合Hibernate面试题部分汇总集合

    Hibernate商业代码汇总

    在Java的持久化框架Hibernate中,分页查询是一项常见的需求,尤其在处理大量数据时,为了提高用户体验和系统性能,我们需要有效地获取特定范围内的记录。本文将深入探讨Hibernate如何实现分页查询,并分析其底层机制...

    hibernate_3配置文件参数汇总

    本篇文章将汇总Hibernate 3配置文件中的关键参数,帮助开发者更好地理解和配置Hibernate。 1. **SQL方言(Dialect)**:`hibernate.dialect` 是一个必不可少的配置项,它定义了Hibernate针对特定关系数据库使用的SQL...

    Hibernate_基础汇总(一)

    ### Hibernate基础汇总(一) #### ORM Mapping 概念解析 ORM(Object Relational Mapping),即对象关系映射,是一种程序技术,用于将关系数据库的数据映射到对象上。这一概念包含三个关键点: - **O:Object** ...

    Hibernate使用技巧汇总

    ### Hibernate使用技巧详解 #### 一、两种配置文件选择及使用场景 - **A. `hibernate.cfg.xml`** - **特点**: 包含数据库连接信息、可用的映射文件等配置。 - **示例**: `Configuration config = new ...

    Hibernate常见面试题汇总

    【Hibernate常见面试题汇总】 1. **数据库查询优化** - **建立索引**:索引可以大大提高查询速度,特别是针对频繁查询的列。 - **减少表间关联**:尽量减少JOIN操作,多表查询可能导致性能下降。 - **优化SQL**...

    Hibernate3的配置参数汇总

    本篇文章将详细汇总Hibernate3的主要配置参数。 1. **Hibernate JDBC属性**: - `hibernate.connection.driver_class`:指定JDBC驱动类,例如`org.postgresql.Driver`用于PostgreSQL数据库。 - `hibernate....

    hibernate文档总结,技术汇总,PDF版的,hibernate简明参考文档

    8. **Criteria API和HQL**: Hibernate提供了HQL(Hibernate Query Language)和Criteria API两种查询语言,它们允许开发者以面向对象的方式来编写查询,比直接写SQL更加灵活和方便。 9. **缓存机制**: Hibernate...

    Hibernate框架技术文档资料汇总

    资源名称:Hibernate框架技术文档资料汇总资源目录:【】EJB3.0实例教程【】HeadFirstHibernate【】Hibernate In Action【】Hibernate【】hibernate【】Hibernate【】Hibernate3.1.2中文文档【】Hibernate3.2官方...

    Hibernate持久层方法汇总

    - `find()`方法提供了基于HQL(Hibernate查询语言)或者SQL的查询功能。它可以接收一个查询字符串和参数,返回一个结果列表,可以是单个对象,List,Set等。这种方法比较灵活,支持复杂的查询条件和关联操作。 3. ...

    hibernate学习资料大全

    Hibernate 提供了一种将Java对象模型与关系数据库之间的映射机制,使得开发者可以使用面向对象的方式来操作数据库,而无需关心底层SQL语句。理解ORM的概念是学习Hibernate的第一步。 2. **Hibernate配置**: 在...

    韩顺平.2011版.hibernate3.3 笔记 ppt 汇总

    6. HQL与Criteria查询:介绍Hibernate特有的面向对象的查询语言HQL,以及Criteria API,它们提供了更直观的查询方式。 7. 查询优化:讨论如何优化查询性能,包括懒加载、缓存策略、查询计划等。 8. 关联映射:详述一...

    Struts Spring Hibernate面试题汇总

    【SSH面试题汇总】主要涉及的是Struts、Spring和Hibernate这三个流行Java EE框架的相关知识,以及MVC设计模式的理解。MVC(Model-View-Controller)模式是软件工程中的一种架构模式,它将应用程序分为三个核心组件:...

    Hibernate_query聚合函数查询.

    本篇主要探讨的是Hibernate对数据库查询中聚合函数的应用,这些功能使我们能够高效地处理数据统计和汇总任务。在学习过程中,我们经常会遇到诸如求和(SUM)、平均值(AVG)、最大值(MAX)、最小值(MIN)以及计数...

    2022年Hibernate常见面试题汇总.doc

    2. **Hibernate查询方式**: - 导航对象图检索:通过已加载对象的关联关系获取其他对象。 - OID查询:使用Session的get()和load()方法,通过对象的唯一标识(OID)检索对象。 - HQL(Hibernate Query Language)...

    Hibernate查询详解

    标题和描述均聚焦于“Hibernate查询详解”,这一主题在IT领域尤其是Java开发中至关重要,因为Hibernate作为一款流行的Java持久层框架,提供了丰富的查询机制,帮助开发者高效地与数据库交互。以下将深入探讨...

    hibernate面试汇总

    hibernate 面试 Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。Hibernate可以应用在任何使用JDBC的场合,既可以...

Global site tag (gtag.js) - Google Analytics