论坛首页 Java企业应用论坛

spring hibernate3.0 如何解决多条件查询

浏览 12132 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-01-16  
  在以前的一些解决方案中,关于多条件查询我都是采用拼SQL语句,但是,hibernate3.0在输入中文时,出现乱码,所以,只有换一种方式来解决;我看大家都说用站位符,但没有很详细的说明,采用站位符,该如何实现多条件差查询;下面是我看文档写的一个测试方法:
      根据userid查询:
     public List searchSysusers(Sysuser sysuser){
    	SessionFactory sessionFactory=getHibernateTemplate().getSessionFactory();
    	Session sess=sessionFactory.openSession();
    	List list=sess.createCriteria(Sysuser.class)
          .add(Restrictions.eq("userid", "test1")).list();
    	sess.close();
    	return list;
    }
    

   根据userid 和department查询:
 
   public List searchSysusers(Sysuser sysuser){
    	SessionFactory sessionFactory=getHibernateTemplate().getSessionFactory();
    	Session sess=sessionFactory.openSession();
    	List list=sess.createCriteria(Sysuser.class)
          .add(Restrictions.eq("userid", "test1"))
          .add(Restrictions.like("department","%工程部%")).list();
    	sess.close();
    	return list;
    }


  都能把结果正确查询出来,但是当我要输入一个或者多个查询条件时,却不知道该如何实现了;因为我输入的查询条件个数是不确定的; 当然,如果我要查询的条件个数不是很多的话,判断以下就成,但是 如果条件很多的话,用判断显然是不行的;
   请教大家这个问题该如何解决?
   发表时间:2007-01-16  
其实这个不难实现,函数输入3个数组:String[] props, String[] opers, Object[] values。第一个参数是条件的属性名,第二个参数是操作符,第三个参数是值。先Criteria cri=sess.createCriteria(Sysuser.class);然后通过一个循环语句来执行cri.add(...);最后执行List list= cri.list();
0 请登录后投票
   发表时间:2007-01-16  

以下供参考,用占位符,输入参数用pojo或map
hibernate为最新的3.2

	 
	 public static List query(String hsql,Object param,
			 int off,int max)throws Exception{
		 
		 
		 Session s = null;
		 Transaction tx = null;
		 Query q = null;
		 List list = null;
		 String c = null;
		 

		 
		 
		 try {
			 s = getSession();
		     //tx = s.beginTransaction();
		     q = s.createQuery(hsql);
		     
		     if(param!=null){
		    	 //q.setProperties(param);
		    	 c = param.getClass().getName();
		    	 //System.out.println(c);
		    	 if(c.equals("java.util.HashMap")){
		    		 q.setProperties((Map)param);
		    	 }else{
		    		 q.setProperties(param);
		    		 
		    	 }
		    	 
		    	 
		     }
		     
		     
		     if(off>0){
		    	 q.setFirstResult(off);
		     }
		     if(max>0){
		    	 q.setMaxResults(max);
		     }
		     list = q.list();
		   
		     //tx.commit();
		     return list;
		 }
		 catch (Exception e) {
		     //if (tx!=null) tx.rollback();
		     throw e;
		 }
		 finally {
		     s.close();
		 }

		 
		 
		 
	 }


	        String sql = null;
                User user = new User();
                Map map = new HashMap();
                List list = null;

		
                sql = "from User where name = :name"; 
		user.setName("tiger");
		list = Hb3Util.query(sql,user,5,8);

                sql = "from User where name like :name";                
		map.put("name","%tiger%");               
		list = Hb3Util.query(sql,map,5,8);



0 请登录后投票
   发表时间:2007-01-16  
 
   public List searchSysusers(Sysuser sysuser){
    	SessionFactory sessionFactory=getHibernateTemplate().getSessionFactory();
    	Session sess=sessionFactory.openSession();
    	Criteria c=sess.createCriteria(Sysuser.class);
         if(XXXXXXX){
              c.add(Restrictions.eq("userid", "test1"));
          }
         if(YYYYYYYY){
             c.add(Restrictions.like("department","%工程部%"));
          }
         List list = c.list();
    	sess.close();
    	return list;
    }

弱智
0 请登录后投票
   发表时间:2007-01-16  
方法大同小异,不过众多的判断语句是少不了的咯:
    		return (List) getHibernateTemplate().execute(new HibernateCallback() {
    			public Object doInHibernate(Session session)
    					throws HibernateException {
    				Criteria crit = session.createCriteria(Xxx.class);
    				getAllConditions(crit, xxxx);	
    				crit.addOrder(Order.asc("xxxx.id"));
    				return crit.list();
    			}
    		});


	private void getAllConditions(Criteria crit, final Xxxx xxxx) {
		
		if (xxxx != null) {
			if (xxxx.getXx() != null && !"".equals(xxxx.getXx())
					&& xxxx.getXx().intValue() != 0) {
				crit.add(Expression.eq("xx", xxxx.getXx()));
			}
			if (xxxx.getXxx() != null 
					&& !"".equals(xxxx.getXxx())) {
				crit.add(Expression.eq("xxx", xxxx.getXxx()));
			}
		}
	}
0 请登录后投票
   发表时间:2007-01-22  
一般可以用map或者数组(不好的选择),作为参数,使用固定函数,
遍历map和数组,
动态生成查询。
0 请登录后投票
   发表时间:2007-01-22  
如果查询条件涉及多个表,那么如何用Criteria或Query组合呢?是先把那些条件所涉及的属性创建一个新的对象,然后再操作。还是有其他好的方法?
0 请登录后投票
   发表时间:2007-01-22  
tony.lee 写道
如果查询条件涉及多个表,那么如何用Criteria或Query组合呢?是先把那些条件所涉及的属性创建一个新的对象,然后再操作。还是有其他好的方法?


createAlias()  Or  createCriteria()
0 请登录后投票
   发表时间:2007-04-03  
如果查询条件涉及多个表,并且各个表之间没有设置关联关系,那有没有办法使用Criteria进行查询呢?
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics