`
seawavenews
  • 浏览: 231531 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

hibernate查询总结

阅读更多

hibernate查询方式举例

1 单个对象

a) Query query=session.createQuery("from ConsortBean a where a.person.id=?");
    query.setString(0,pb.getId());//参数从零开始
    List list=query.list();

b) Query query=session.createQuery("from ConsortBean a where a.person.id=:id");
    query.setString("id",pb.getId());
   List list=query.list();

c) List list =session.find(
 "from ConsortBean a where a.person.id=?",
 pb.getId(),
 Hibernate.STRING);

2 分页

int pagecount = 10;//每页数量


..
q =
session.createQuery(
"from FootPayRequestBean as fprb where fprb.state=? order by fprb.contractID");
q.setString(0, type);

q.setFirstResult(page * pagecount);//page从0开始
q.setMaxResults(pagecount);
l = q.list();
 

3 求count()

((Integer) session.iterate("select count(*) from ConsortBean").next() ).intValue();

4 联合查询

Query query=session.createQuery("select a from ConsortBean a,PersonBean b where a.person.id=b.id and b.name like ?");//对象别名
query.setString(0,"%管%");
List list=query.list();

--------------------------------Hibernate综合查询解决方案-------------------------------

 这两个星期以来,我把原来用struts开发的一个测试工具改用struts+hibernate来实现,首先从心情上来,整个开发过程中始终保持愉快和平和,“原来开发可以这样愉快?”,再一点就是开发效率上高效了许多。
      现在sun又加入jdocentral.com开始着手JDO2.0,想想看等它出台以后将是一个怎样激动人心得场面,让我们拭目以待。
      
      用Hibernate来操纵持久数据非常简单,在这里一些简单的查询我会一笔带过,本文着重说明在综合查询兼有分页的时候我的一些经验,如果网友觉得我的方案还有不足的地方,也请和我讨论,我的email:plateau_t@sina.com.
      
      第一部分:Hibernate提供的查询接口或其方法(此部分不做深究,请参考hibernate手册)
      
       1。根据ID查询
    要用到Session接口的load方法。
    load(Class theClass, Serializable id) 
    load(Class theClass, Serializable id, LockMode lockMode)
    load(Object object, Serializable id)  
    
       2。HQL语句进行查询
       
       2。1 利用Query接口,Query由Session里的createQuery()来产生一个查询
        1)不带参数的查询(这类比较简单)
        Query query=session.createQuery("select user from User as user");
        2)带参数的查询
        Query query=session.createQuery("select user from User as user where user.name=?");
        query.setString(0,name)//假设name为传过来的参数
        Query query=session.createQuery("select user from User as user where user.name=:name");
        query.setString("name",name)//假设name为传过来的参数 
        (多个参数以此类推) 
        
        利用Session接口的find查询
        find(String query) 
        find(String query, Object[] values, Type[] types) 
        find(String query, Object value, Type type)    均返回list   
        如:
        List list=session.find("select user from Users as user where user.name=?",name,Hibernate.STRING)
        List list=session.find("select user from Users as user where user.name=? and             user.pw=?",new Object[]{name,pw},new Type[]{Hibernate.STRING,Hibernate.STRING})
        
        {推荐使用Query的方法进行查询}   
        
      第二部分:hibernate综合查询解决方案 (此部分详细实例说明,如有不足的地方请写信给我)         
      
       大家从第一部分可以看到,带有参数的查询,必须使用到Query接口,如上边:
        Query query=session.createQuery("select users from Users as users where users.name=?");
        query.setString(0,name)//假设name为传过来的参数    
       但是在系统中如何才能写一个公用的查寻方法呢?咋一看,似乎是不可以的,因为每一次查询的参数不一样,参数的数量不一样(如下代码),那么我们如何提取共性呢?   
         Query query=session.createQuery("select users from Users as users where users.name=? and users.pw=?");
        query.setString(0,name)//假设name为传过来的参数  
        query.setString(1,pw); 
       
      首先说明,我的解决方案是从Seesion接口的find方法找到出口的,如下为Session接口得find()方法之一:
        find(String query, Object[] values, Type[] types)  
      其中Object[]为存放参数值的数组,Type[]为存放参数类型的数组,他们的顺序是和query里“?” 的顺序是相同的。那么我为什么不用该find方法呢,因为如果有分页的情况,那么该方法将不适用。
    
      下面详细要说明的解决方案:
      首先我想创建三个新的对象:Paras.java(参数对象) ParasList.java(参数集合对象)HQuery.java
     (感谢我的同事camel提供注释良好的代码)
     1。Paras.java(参数对象)
    
  package com.ifreeway.homegrown.testing.waf;
  
  /**
   *
   * <p>Title:定义一个sql语句的条件参数类 </p>
   * <p>Description: 可以使用有序的参数集合传送给sql/hql语句 </p>
   * <p>Copyright: Copyright (c) 2003</p>
   * <p>Company: ifreeway</p>
   * @author camel
   * @version 1.0
   */
  
  public class Paras {
   /**
    * 参数名称
    */
   private Object pName;
   /**
    * 参数类型编码,于java.sql.types中的类型保持一致
    */
   private int typeNo;
  
   public Object getPName() {
    return pName;
   }
   public void setPName(Object pName) {
    this.pName = pName;
   }
   public int getTypeNo() {
    return typeNo;
   }
   public void setTypeNo(int typeNo) {
    this.typeNo = typeNo;
   }
  }  
 
 2。ParasList.java(参数集合对象) 
  package com.ifreeway.homegrown.testing.waf;
  
  import java.util.ArrayList;
  
  /**
   *
   * <p>Title: 参数集合类</p>
   * <p>Description: 封装sql/hql的参数到该集合类,便于处理和传递</p>
   * <p>Copyright: Copyright (c) 2003</p>
   * <p>Company: ifreeway</p>
   * @author camel
   * @version 1.0
   */
  
  public class ParaList extends ArrayList {
  
    /**
     * 在指定位置添加一个参数对象
     * @param index:参数的索引值
     * @param p:需要加入的参数对象
     */
    public  void addParas(int index,Paras p){
        super.add(index,p);
    }
  
    /**
     * 在集合的最后位置添加一个参数对象
     * @param p:需要加入的参数对象
     */
    public void addParas(Paras p){
      super.add(p);
    }
  
    /**
     * 取得指定位置的参数对象
     * @param index:参数的索引值
     * @return:参数对象
     */
    public Paras getParas(int index){
        return (Paras)super.get(index) ;
    }
    /**
     * 取得指定参数的索引
     * @param p:参数对象
     * @return:参数索引
     */
    public int indexofParas(Paras p){
       return super.indexOf(p) ;
    }
  
    /**
     * 从集合中去掉一个指定的参数对象
     * @param index:参数索引
     */
    public void removeParas(int index){
      super.remove(index) ;
    } 
  
  }  
 3。HQuery.java
  package com.ifreeway.homegrown.testing.waf;
  
  
  /**
   *
   * <p>Title: HQL的语句封装类</p>
   * <p>Description: 该对象封装HQL的查询语句,参数集合,排序参数,分组参数,单页起始地址  </p>
   * <p>Copyright: Copyright (c) 2003</p>
   * <p>Company:ifreeway </p>
   * @author camel
   * @version 1.0
   */
  
  public class HQuery {
  
    /**
     * HQL查询语句
     */
    private String queryString;
    /**
     * 参数集合对象
     */
    private ParaList paralist;
    /**
     * 排序字段
     */
    private String orderby;
    /**
     * 分组字段
     */
    private String groupby;
    /**
     * 分页起始查询地址
     */
    private int pageStartNo;
  
    /**
     * 取得一个Hibernate的Query对象
     * @return:Query对象
     */
    public String getQueryString() {
      return queryString;
    }
  
    /**
     * 设置一个HQL查询字符串
     * @param queryString:查询字符串
     * 
     */
    public void setQueryString(String queryString) {
   
     this.queryString =queryString;
  
    }
  
    /**
     * 取得参数集合对象
     * @return:参数集合对象
     */
    public ParaList getParalist() {
      return paralist;
    }
  
    /**
     * 设置参数集合对象
     * @param paralist:参数集合对象
     */
    public void setParalist(ParaList paralist) {
      this.paralist = paralist;
    }
  
    /**
     * 取得排序字段
     * @return:排序字段
     */
    public String getOrderby() {
      return orderby;
    }
  
    /**
     * 设置排序字段
     * @param orderby
     */
    public void setOrderby(String orderby) {
      this.orderby = orderby;
    }
  
    /**
     * 取得分组字段
     * @return
     */
    public String getGroupby() {
      return groupby;
    }
  
    /**
     * 设置分组字段
     * @param groupby
     */
    public void setGroupby(String groupby) {
      this.groupby = groupby;
    }
  
    /**
     * 取得页起始地址
     * @return
     */
    public int getPageStartNo() {
      return pageStartNo;
    }
  
    /**
     * 设置页起始地址
     * @param pageStartNo
     */
    public void setPageStartNo(int pageStartNo) {
      this.pageStartNo = pageStartNo;
    }
  } 
  
 上面三个对象的关系是:
 
 用Paras来装载每一个查询参数
  Paras paras=new Paras();
  paras.setPName(...);
  paras.setTypeNo(...);
 然后放在ParasList中
  ParasList paraslist=new ParasList();
  paraslist.add(paras)
 最后把填充以后的ParasList集合给HQuery  
  HQuery hquery=new HQuery();
  hquery.setParalist(paraslist);
  
 先面我们写一个公用查寻方法,来实现我们的综合查询:
 
 /**
  *
  *  综合查询,首先实例化HQuery
  * @see com.ifreeway.homegrown.testing.common.waf.DBHandler#find(com.ifreeway.homegrown.testing.common.waf.HQuery)
  */
 public List find(HQuery _query) throws HibernateException {
  List itr = null;
  try {
   StringBuffer query_str = new StringBuffer(_query.getQueryString());
   //是否要排序
   if (_query.getOrderby() != null) {
    query_str.append(_query.getOrderby());
   }
   //是否要分组
   if (_query.getGroupby() != null) {
    query_str.append(_query.getGroupby());
   }
   Session session = getSession();
   Query query = session.createQuery(query_str.toString());
   if (_query.getParalist() != null) {
    List list = _query.getParalist();
    for (int i = 0; i < list.size(); i++) {
     Paras param = (Paras) list.get(i);
     switch (param.getTypeNo()) {//此处要根据参数类型的增加要增加相应的“case”
      case Types.VARCHAR :
       query.setString(i, param.getPName().toString());
       break;
      case Types.INTEGER :
       query.setInteger(
        i,
        ((Integer) param.getPName()).intValue());
       break;
      case Types.DATE :
       query.setDate(i, (java.sql.Date) param.getPName());
       break;
      case Types.DOUBLE :
       query.setDouble(
        i,
        ((Double) param.getPName()).doubleValue());
       break;
      case Types.BOOLEAN :
       query.setBoolean(
        i,
        ((Boolean) param.getPName()).booleanValue());
       break;
      case Types.CHAR :
       query.setCharacter(
        i,
        ((Character) param.getPName()).charValue());
       break;
      case Types.JAVA_OBJECT :
       query.setEntity(i, (BaseModel) param.getPName());
       break;
     }
    }
   }
   //是否存在分页,当_query.getPageStartNo()==0是不分页
   if (_query.getPageStartNo() != 0) {
    int pageno = _query.getPageStartNo();
    query.setFirstResult((pageno - 1) * Constants.RECORD_PER_PAGE);
    query.setMaxResults((pageno) * Constants.RECORD_PER_PAGE);
   }
   itr = query.list();
   closeSession();
  } catch (Exception e) {

  }
  return itr;
 } 
    
      好了一旦我们做好了上边的工作,查询对我们来说将是很容易的一件事情,而且可以达到公用,是不是省了许多力气?下面我将实例化一个例子来进一步说明:
      
      例子:
      HQuery hquery=HQuery();
      hquery.setQueryString("select users from Users as users where users.name=? and users.sex=?");
      hquery.setOrderby("order by users.age desc");
      
      //如果要分页,把当前页curpage传递给hquery
      hquery.setPageStartNo(curpage);
      
      //实例化参数,本例为两个参数
      Paras paras1=new Paras();
      paras1.setPName(name);
      paras1.setTypeNo(Types.VARCHAR);
      
      Paras paras2=new Paras();
      paras2.setPName(sex);
      paras2.setTypeNo(Types.INTEGER);
      
      ParasList paraslist=new ParasList();
      paraslist.add(paras1);
      paraslist.add(paras2);//注意顺序
      
      hquery.setParalist(paraslist);
      
      //好了,做好准备工作,调用查寻方法得到结果
      List list=find(hquery);
      
分享到:
评论

相关推荐

    Hibernate知识点总结

    ### Hibernate知识点总结 #### 一、Hibernate概述 Hibernate是一个开源的ORM(Object Relational Mapping,对象关系映射)框架,用于Java应用与关系型数据库之间的交互。它通过使用描述对象和数据库之间映射的元...

    hibernate学习总结文档

    2. **读取(Read)**:`get()` 或 `load()` 方法用于根据主键获取对象,`query()` 或 HQL(Hibernate 查询语言)用于执行更复杂的查询。 3. **更新(Update)**:修改对象后,调用 `update()` 或 `merge()` 方法同步...

    Hibernate4总结文档

    《Hibernate4总结文档》 Hibernate4作为一款强大的Java对象关系映射框架,简化了数据库操作,使得开发者可以更专注于业务逻辑而不是数据库层面的细节。本文将深入探讨Hibernate4的配置和使用,帮助开发者更好地理解...

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

    总结来说,Hibernate是一个强大的ORM框架,它极大地简化了Java应用的数据库操作,提高了开发效率,并提供了高级特性如缓存、事务管理等。通过深入理解和熟练使用Hibernate,开发者可以构建更高效、更易于维护的...

    Hibernate三大类查询总结

    本文将对Hibernate的三大类查询进行详细总结,包括Cretiria查询、HQL查询以及本地SQL查询。 首先,我们来看Cretiria查询,这是Hibernate提供的一种基于对象的查询方式,具有高度的灵活性和可扩展性。`Criteria`接口...

    Hibernate连表查询 Hibernate连表查询

    根据提供的文件信息,我们可以深入探讨Hibernate中的连表查询方法及其应用。下面将详细介绍与标题、描述及部分代码相关的几个核心知识点: ### Hibernate 连表查询基础 Hibernate 是一个开源的对象关系映射(ORM)...

    通用的hibernate查询

    【hibernate查询详解】 Hibernate,作为一款强大的Java对象关系映射(ORM)框架,极大地简化了数据库操作。它允许开发者使用面向对象的方式来处理数据库,从而避免了传统的JDBC编码方式带来的复杂性。本篇文章将...

    Hibernate三大类查询总结.doc

    《Hibernate三大类查询总结》 在Java的持久化框架中,Hibernate以其强大的功能和易用性占据了重要地位。在处理数据库查询时,Hibernate提供了三种主要的查询方式:Criteria查询、HQL(Hibernate Query Language)和...

    Hibernate_query查询数据表中的一个字段.

    总结,Hibernate提供多种方式查询数据表中的字段,包括HQL、Criteria API和DetachedCriteria,选择合适的方法取决于具体需求。正确理解和使用Hibernate,能够大大提高Java开发中的数据库操作效率。

    struts+hibernate查询所有记录

    ### Struts+Hibernate查询所有记录 #### 一、概述 在Java Web开发中,Struts与Hibernate是非常流行的框架组合,用于构建复杂的企业级应用。本文将详细介绍如何利用Struts和Hibernate来实现对Oracle数据库中所有...

    hibernate多表联合查询

    ### Hibernate多表联合查询详解 #### 一、引言 在实际项目开发中,我们经常需要处理复杂的数据库查询,特别是涉及到多个表之间的关联查询。Hibernate作为一款流行的Java持久层框架,提供了一种非常便捷的方式来处理...

    Hibernate hql查询语法总结

    本文将对Hibernate HQL查询语法进行总结,涵盖基础查询、属性查询、实例化查询以及查询链接等多个方面。 1. 基础查询: 基础查询是最简单的HQL语句,用于获取所有`Student`对象。例如: ```java from Student ``` ...

    Hibernate 简单 PPT 总结

    【Hibernate 简单 PPT 总结】 Hibernate 是一个流行的开源对象关系映射(ORM)框架,它简化了Java应用程序对数据库的操作。通过提供一套API和元数据,Hibernate允许开发者将业务对象直接映射到数据库表,从而避免了...

    Hibernate学习笔记与总结

    **Hibernate学习笔记与总结** Hibernate 是一款开源的对象关系映射(ORM)框架,它为Java开发者提供了一种在关系数据库上操作对象数据的便捷方式。本文将深入探讨Hibernate的核心概念、配置、实体类、映射文件、...

    Hibernate重点总结

    在本文中,我们将深入探讨Hibernate的关键概念、配置、实体管理、查询语言以及缓存机制。 1. **基本概念** - **对象关系映射(ORM)**: ORM是将数据库表映射为Java类,将SQL语句转换为对象操作的一种技术,简化了...

    Hibernate的查询方式

    ### Hibernate的查询方式详解 #### 引言 Hibernate作为Java领域中最流行的ORM(Object-Relational Mapping)框架之一,提供了一系列高效、灵活的查询机制,旨在桥接对象模型与关系数据库之间的鸿沟。本文将深入...

Global site tag (gtag.js) - Google Analytics