hibernate 多条件查询方法 收录

时间:2022-04-23 22:19:52
 

hibernate 多条件查询方法 收录

 

方法一、


1. Hibernate多条件查询通用方法

 
  1. //value[i]为第i个查询条件propertyName[i]的值          (本方法已通过测试) 
  2.  
  3.  
  4. public List searchByPropertys(String model,String[]propertyName,Object[] value,int page,boolean rigor){    
  5.     StringBuffer sqlBuffer new StringBuffer();  
  6.     String ralation=like ";  
  7.     if(rigor){  
  8.      ralation=";  
  9.     }  
  10.     sqlBuffer.append("from "+model+as model\n");  
  11.     int len=propertyName.length;  
  12.     List list=new ArrayList();  
  13.     boolean first=true;  
  14.     for(int i=0;i< len;i++){  
  15.      if(value[i]!=null){  
  16.      if(first){      
  17.       sqlBuffer.append(where ""model."propertyName[i] ralation+?\n");      
  18.       list.add(value[i]);  
  19.       first=false;  
  20.      }else     
  21.       sqlBuffer.append(and ""model."propertyName[i] +ralation+ ?\n");      
  22.       list.add(value[i]);  
  23.      }  
  24.     }  
  25.     }  
  26.     
  27.      try            
  28.       Session session=getSession();  
  29.              Query queryObject session.createQuery(sqlBuffer.toString());  
  30.              for(int i=0;i< list.size();i++){  
  31.              if(rigor){  
  32.               queryObject.setParameter(i, list.get(i));  
  33.              }else{  
  34.               queryObject.setParameter(i, "%"+list.get(i)+"%");  
  35.              }  
  36.              
  37.       }  
  38.             
  39.             list=queryObject.list();  
  40.             closeSession(session);  
  41.       return list;  
  42.          catch (RuntimeException re) {  
  43.             log.error("find by property name failed"re);  
  44.             throw re;  
  45.          }  
  46.  
  47. }
  48.  
方法二、

2:hibernate多条件组合查询 之 sql 拼接

这个方法与上面第一节中的相同,只不过上面的方法是将搜索的多个条件在外部(即调用方)封装在了数组中。

 
  1. public static void main(String[] args)     
  2.             
  3.        Session session null    
  4.        Transaction tx null    
  5.        List list null    
  6.        Criteria criteria null    
  7.       
  8.        try     
  9.       
  10.            session HibernateSessionFactory.getSession();     
  11.            tx session.beginTransaction();     
  12.       
  13.            DetachedCriteria detachedCriteria DetachedCriteria     
  14.                   .forClass(InfoTab.class);     
  15.                 
  16.                 
  17.            String sql=1=1 "    
  18.                 
  19.            Integer pareaId 0// 父地区;    
  20.            Integer careaId 0// 子地区;    
  21.            Integer categoryId 0// 类别;    
  22.            String infoPrivider "中介"// 来源;    
  23.            String houseType= "地下室"// 房屋类型;    
  24.            Integer hxBedRoom=0// 室;    
  25.            Integer hxLivingRoom=0// 厅;    
  26.                 
  27.            String hzHouseStatus="有房出租"// 合租类型;    
  28.            String hzRequestSex="男"// 性别要求;    
  29.            String fixUp="尚未"// 装修程度;    
  30.            Integer lcHeightMolecuse=0// 楼层;    
  31.            String orientation="东南"// 朝向要求;    
  32.            Integer buildArea=2000// 建筑面积;    
  33.            Integer useArea=80// 使用面积;    
  34.            Integer rentalDigit=2000// 租金/价格;    
  35.            String title= "出租"// 标题;    
  36.                 
  37.            if(pareaId!=0    
  38.                
  39.               sql+="pareaId=" pareaId;     
  40.                
  41.            if(careaId!=0    
  42.                
  43.               sql+=and careaId=" careaId;     
  44.                
  45.            if(categoryId!=0    
  46.                
  47.               sql+=and categoryId=" categoryId;     
  48.                
  49.            if(!infoPrivider.equals(""))     
  50.                
  51.               sql+=and infoPrivider='" infoPrivider "'"    
  52.                
  53.            if(!houseType.equals(""))     
  54.                
  55.               sql+=and houseType='" houseType +"'"    
  56.                
  57.            if(hxBedRoom!=0    
  58.                
  59.               sql+=and hxBedRoom=" hxBedRoom;     
  60.                
  61.            if(hxLivingRoom!=0    
  62.                
  63.               sql+=and hxLivingRoom=" hxLivingRoom;     
  64.                
  65.            if(!hzHouseStatus.equals(""))     
  66.                
  67.               sql+=and hzHouseStatus='" hzHouseStatus "'"    
  68.                
  69.            if(!hzRequestSex.equals(""))     
  70.                
  71.               sql+=and hzRequestSex='" hzRequestSex +"'"    
  72.                
  73.            if(!fixUp.equals(""))     
  74.                
  75.               sql+=and fixUp='" fixUp "'"    
  76.                
  77.            if(lcHeightMolecuse!=0    
  78.                
  79.               sql+=and lcHeightMolecuse=" lcHeightMolecuse;     
  80.                
  81.            if(!orientation.equals(""))     
  82.                
  83.               sql+=and orientation='" orientation "'"    
  84.                
  85.            if(buildArea!=0    
  86.                
  87.                sql+=and buildArea=" buildArea;     
  88.                
  89.            if(useArea!=0    
  90.                
  91.               sql+=and useArea=" useArea;     
  92.                
  93.            if(rentalDigit!=0    
  94.                
  95.               sql+=and rentalDigit=" rentalDigit;     
  96.                
  97.            if(!title.equals(""))     
  98.                
  99.               sql+=and title like '%" title "%'"    
  100.                
  101.            sql+=order by id desc"    
  102.                 
  103.            System.out.println(sql);     
  104.       
  105.            detachedCriteria.add(Restrictions.sqlRestriction(sql));     
  106.       
  107.            criteria detachedCriteria.getExecutableCriteria(session);     
  108.       
  109.            list criteria.list();     
  110.                 
  111.            for(int i=0;i< list.size();i++)     
  112.                
  113.               InfoTab infoTab (InfoTab)list.get(i);     
  114.               System.out.println(infoTab.getTitle() +"infoTab.getCategoryId() +"infoTab.getPareaName() +"infoTab.getCareaName() +" infoTab.getHouseType() +" infoTab.getInfoPrivider());     
  115.                
  116.       
  117.            tx.commit();     
  118.       
  119.        catch (HibernateException he)     
  120.            he.printStackTrace();     
  121.            
  122.      
  123.  







方法三、

此方法可多条件查询且可以根据关联的表条件进行查询
如查询某个商品:
表结构如下:
goods(商品表)
goodsid(商品id) goodsname(名称) typeid(分类-外键)  supplierid(供应商-外键)

type(分类表)
typeid(id主键)   typename(分类名称)

supplier(供应商表)
supplierid(ID主键)   suppliername( 供应商名称)

你可建一个查询条件的类,里面包括你要查询的所有字段
如: public class Query{
    private String suppliername;
    private String goodsname;
    private String typename;
..................
get/set方法................
}

得到查询条件后,可以把此类的一个对象传入自己做的方法,此方法可以根据条件的个数及是否输入条件进行查询:
public static List query_goods(Query query){
        Session session = SessionFactory.getSession();
        Criteria criteria = session.createCriteria(Goods.class);
        Criteria type = criteria.createCriteria("type");
        Criteria  supplier= criteria.createCriteria("supplier");
     
        if(null!=query.getGoodsname() && !"".equels(query.getGoodsname() ))
            criteria.add(Restrictions.like("goodsname","%"+query.getGoodsname()+"%"));
       
       if(null!=query.getSuppliername() && !"".equels(query.getSuppliername() ))
            supplier.add(Restrictions.like("suppliername","%"+query.getSuppliername()+"%"));

        if(null!=query.getTypename() && !"".equels(query.getTypename() ))
            type.add(Restrictions.like("typename","%"+query.getTypename+"%"));
        
        List list = criteria.list();
        
        session.clear();
        session.close();
        return list;
    }

以上方面还可多层的嵌套,如type里还有外键,可以按照以上方法进行嵌套。注意,查询时所有涉及到的数据都将一次性写入类的属性中,包括有关联的,即此时goods的关联延迟加载无效,我觉得这一点非常的好。呵呵,有什么好处,可以自己好好的想想。
有许多人曾经提到过用Example,就不用自己判断了,如果没有关联条件查询的话,确实是好,可它的缺点就是不能查询关联中的条件。