[Java基础知识] [Java高级编程] [Java网络编程] [J2EE]
 [开发工具] [中间件] [Web开发] [J2ME] [JSP] [Web开发]
 [Java与数据库] [Java开源] [设计模式] [在线文档]
下载中心
[Java教程] [开发工具] [代码源码]
[Oracle数据库] [视频教程]

关于Hibernate综合查询解决方案

发布时间:2008-1-25 21:37:11     来源:赛迪网    作者:赛迪网

 

这两个星期以来,我把原来用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;
  
  /**
   *
   * 

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.

[1] [2] [3] 下一页


发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
  相关文章
   
  • 上一个JAVA文章:

  •  
  • 下一个JAVA文章:
  •        
      网友评论
      精彩友情推荐  

  • 关于我们 | 版权申明 | 网站地图 | 广告指南 | 友情链接 | 联系我们
  • Copyright (C) 2003-2008 Javafan.net, All Rights Reserved 版权所有 Java爱好者 京ICP备05010995号