把ArrayList中的元素类型不要统一设成String,然后在根据传入的ArrayList中的元素的类型来判断使用setString还是setDate等等,这样不行吗?

解决方案 »

  1.   

    写一堆if 不就行了
    if( xxx instanceof String)
       pstmt.setString();
    if (xxx instanceof Date)
       pstmt.setDate();
    ...
      

  2.   

    to:zhenlau() 
       能举个例子说明一下吗???谢谢了!!aChinese(一个中国人)
      你的方法确实可以解决问题,但是不是有点繁琐?如果这样的话,那我岂不是要把所有的类型都要IF到?那。。
    HB里有类似pstmt.setString(countI, temStr);这样一种方法搞定所有参数的类方法吗?你平常的动态综合搜索又是怎么做的呢??(比如说车辆系统,可以根据车牌号码,生产日期,购买费用,驾驶员来搜索所要的记录,有可能是一个条件,也有可能是几个条件综合。你在搜索的时候也是如你所说的吗?)  
     
      

  3.   

    这么做无非是用运行效率换开发效率, 值得的话就换
    写一堆if 是麻烦, 反正也就麻烦一次.  综合搜索我是用sql做的, 只做查询,不会修改数据, 所以也不怕不能和hibernate同步.
      

  4.   

    一般用hibernate查询我也不用hql,  用Criteria, DetachedCriteria,  我觉得这才面向对象, 符合O/R映射的本意, 操作强类型的东西在编译期就可以避免出错.
    一般都这么写
     DeteachedCriteria dcri = DeteachedCriteria.forClass(TB1.class);
     if( 车牌号码 != null || !"".equals(车牌号码))
             dcri.add(Restrictions.eq("carNo",车牌号码);
      if( 生产日期1 != null || !"".equals(生产日期1))
             dcri.add(Restrictions.le("brith",生产日期1);
      if( 生产日期2 != null || !"".equals(生产日期2))
             dcri.add(Restrictions.ge("brith",生产日期2);
      ...
      一大堆if 把条件都包含进去
      然后执行
      dcri.getExecutableCriteria(session)
           .list();
      

  5.   


    你用setParameter阿,不需要类型判断。Query q=session.createQuery("from TB1 tb1 where tb1.item1=?,tb1.item2=?...")
    q.setParameter(0,"a");
    q.setParameter(1,new Integer(2));
    q.setParameter(2,"2006-6-6")
    .............
      

  6.   

    我不明白以上的大哥 都想什么利用JAVA反射 实现不行么
      

  7.   

    to: pigo
       谢谢指教,你应该就是我想要的,但这种会不会在运行期发生强类型编译错误??确定可行吗?
    TO:javaRoot() 
      JAVA反射??具体怎么做?能指教一二吗?
      

  8.   

    spring对hibernate的封装就是这样写的,我的程序中已经使用了不知道多少次了:
    下面这段代码是spring里的
    public List find(final String queryString, final Object[] values) throws DataAccessException {
    return (List) execute(new HibernateCallback() {
    public Object doInHibernate(Session session) throws HibernateException {
    Query queryObject = session.createQuery(queryString);
    prepareQuery(queryObject);
    if (values != null) {
    for (int i = 0; i < values.length; i++) {
    queryObject.setParameter(i, values[i]);
    }
    }
    return queryObject.list();
    }
    }, true);
    }