`

关于Hibernate综合查询解决方案

    博客分类:
  • java
阅读更多

 第一部分: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;
 
  /**
   *
   * 
Title:定义一个sql语句的条件参数类
   * 
Description: 可以使用有序的参数集合传送给sql/hql语句
   * 
Copyright: Copyright (c) 2003
   * 
Company: ifreeway
   * @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;
 
  /**
   *
   * 
Title: 参数集合类

   * 
Description: 封装sql/hql的参数到该集合类,便于处理和传递

   * 
Copyright: Copyright (c) 2003

   * 
Company: ifreeway

   * @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;
 
 
  /**
   *
   * 
Title: HQL的语句封装类

   * 
Description: 该对象封装HQL的查询语句,参数集合,排序参数,分组参数,单页起始地址 

   * 
Copyright: Copyright (c) 2003

   * 
Company:ifreeway

   * @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);

分享到:
评论

相关推荐

    四川电信账详单综合查询系统解决方案书doc Google Code.doc

    四川电信账详单综合查询系统解决方案书 本解决方案书旨在提供一个基于Google Code的四川电信账详单综合查询系统,旨在解决四川电信账详单查询的复杂性和低效的问题。下面是该系统的详细设计和实现方案。 1. 概述 ...

    hibernate for netbeans5.5

    综合以上信息,我们可以推断这是一个针对NetBeans 5.5的Hibernate集成解决方案,包含了Velocity模板引擎、XDoclet元数据生成、JDOM XML处理、以及对Struts框架的支持。开发者可以通过安装这些模块,提高在NetBeans中...

    HIBERNATE doc_document_官方文档_4.3.6_final_2014_8

    Hibernate是一个开源的对象关系映射(Object/Relational Mapping,简称ORM)框架,它提供了从Java对象模型到关系数据库数据模型的映射解决方案。在Java开发中,Hibernate极大地简化了数据库操作,并且为开发者提供了...

    新闻发布例子—struts和hibernate和综合

    标题 "新闻发布例子—Struts和Hibernate综合应用" 暗示了这个压缩包可能包含一个使用Struts和Hibernate两个著名Java框架开发的新闻发布系统的实例。Struts是MVC(Model-View-Controller)架构的一个实现,主要用于...

    Spring,hibernate,struts的面试笔试题(含答案)

    1. **ORM(对象关系映射)**:Hibernate是一个全功能的持久层解决方案,主要用于将Java对象映射到数据库表及其字段上。这极大地简化了数据访问层的编码工作,使得开发者可以更加专注于业务逻辑而不是数据访问细节。 ...

    SSH(Struts+Spring+Hibernate)结合项目简单实例

    Spring框架是一个全面的后端开发解决方案,提供了依赖注入(DI)、面向切面编程(AOP)以及数据访问等多种功能。在SSH组合中,Spring主要负责管理对象的生命周期和依赖关系。 1. **依赖注入**:Spring通过XML配置或...

    ibatis和hibernate的简单介绍

    Hibernate的主要目标是为开发者提供一个无缝的持久层解决方案,使得开发者可以完全专注于业务逻辑而不必关心数据库交互的细节。 **Hibernate特点:** 1. **自动化的ORM映射**:Hibernate能够自动将Java对象映射到...

    关于Struts1&2 Spring Hibernate 三大框架学习综合整理

    Struts1、Struts2、Spring和Hibernate是Java Web开发中的四大主流框架,它们各自有着独特的功能和优势,同时也常被结合使用,形成了所谓的SSH(Struts+Spring+Hibernate)集成解决方案,为开发者提供了强大的后端...

    最新springMVC hibernate Maven项目

    在"mvch_case"这个项目中,这些技术的整合使用,形成了一个前后端分离、数据库操作便捷、项目构建自动化的完整解决方案。SpringMVC和Hibernate在后端处理业务逻辑和数据,AngularJS在前端提供丰富的用户体验,而...

    springmvc_hibernate_ibatis_jdbc

    这个框架旨在提供一个全面且强大的解决方案,便于开发人员进行Web应用程序的构建。 1. **SpringMVC**:SpringMVC是Spring框架的一个模块,专门用于构建Web应用程序。它提供了模型-视图-控制器(MVC)架构模式的实现...

    spring mvn + hibernate maven项目

    总的来说,"Spring MVC + Hibernate Maven项目"是一个完整的Java Web解决方案,涵盖了从前端到后端的各个层面,利用Maven进行项目构建,提高了开发的标准化和效率,是现代企业级应用开发的常见选择。

    spring_hibernate_in one and find more than 1 rs

    这可能对初学者或者寻求特定解决方案的开发者很有帮助,因为他们可以直接查看和学习源代码。 文件列表: 1. `.classpath` - 这是Eclipse或类似的IDE项目中的配置文件,用于指定项目的类路径,包括库依赖和其他资源...

    maven整合spring+hibernate+struts2

    本项目“maven整合spring+hibernate+struts2”就是一个典型的Java Web开发模式,它利用Maven作为项目管理工具,Spring作为核心框架,Hibernate作为持久层解决方案,Struts2作为表现层控制器。以下将详细阐述这些技术...

    hibernate4+spring4+memcached 工程

    【标题】"hibernate4+spring4+memcached 工程"是一个集成项目,它结合了三个关键的开源技术,旨在提供一个高效且可扩展的后端数据管理解决方案。Hibernate 4是Java领域中最流行的ORM(对象关系映射)框架,它允许...

    基于JavaEE Struts+Spring+Hibernate 综合的网上手机销售管理系统

    一个基于JavaEE的网上手机销售管理系统,结合Struts、Spring和Hibernate三大框架,可以为企业提供稳定、可扩展且易于维护的解决方案。本文将深入探讨这个系统的构建原理与实现细节。 首先,JavaEE(Enterprise ...

    集成spring的hibernate懒加载

    为了解决这个问题,有几种常见的解决方案: 1. **Open Session in View (OSIV)**:这是一种将Session保持开放到视图渲染完毕的设计模式,通常通过Spring的`OpenEntityManagerInViewFilter`或`...

    名片管理系统 (Struts2+Hibernate)

    【Struts2框架】Struts2是Java Web开发中的一个MVC(Model-View-Controller)框架,它提供了控制层的解决方案,使得开发者可以更轻松地处理HTTP请求和响应。Struts2的核心是Action类,它负责接收请求、处理业务逻辑...

    struts+hibernate+spring实现学生选课系统

    Struts、Hibernate和Spring是Java开发中的三大框架,它们共同构建了一个强大的企业级应用开发解决方案,被称为SSH(Struts、Spring、Hibernate)框架。在这个"学生选课系统"项目中,这三个框架协同工作,实现了高效...

    spring+hibernate教程

    Hibernate是Java社区中最流行的ORM解决方案之一,它允许开发者用面向对象的方式来处理数据库操作,消除了SQL的繁琐。通过Hibernate,你可以定义Java类来映射数据库表,使用HQL(Hibernate查询语言)进行查询,以及...

Global site tag (gtag.js) - Google Analytics