我用HQL进行条件查询String hql="from Orders as ord where ord."+name+" <"+1000+" order by ord.order_number ";
session.createQuery(hql)String hql="from Orders as ord where ord.? <? order by ord.order_number";
session.createQuery(hql)
.setString(0, name)
.setInteger(1, 12345)这两种方式到底有什么本质区别,为什么第一种不报错,而第二种报错?第二种的问号有的字段能用有的字段不能用,比如上面的,那一般在什么情况下用呢?还有第一种拼串的方式不推荐用,那我怎么办呢?
那位高手解答下,感激不尽!

解决方案 »

  1.   

    第一种容易被SQL注入。
    第二种是预编译可以防止SQL注入,只不过楼主使用有问题。ord.?貌似不能用setString来传值
      

  2.   

    我现在要完成的功能就是用户输入不同的查询条件进行查询,第一种拼串的方法肯定有sql注入的风险,既然第二种不行,难道就没有其他方法了么?
      

  3.   

    那就用第一种吧,不过要对name进行严格的check
      

  4.   

     ord.?  这个部分改用判断语句替换可以吗?
    例如有name ,id 两个选项;
    if(!name.equals("")){
        hql =   ....;
    }
    else if(!id.equals("")){
        hql = ....;
    }
    剩下的一个字段就可以使用setInteger()了;
    我也不太清楚,只是发表一下个人看法而已。java7的switch可以对字符串进行选择,真的挺期待的
      

  5.   

    如果是这样,不妨试试 hibernate中的 离线查询。可以对动态参数进行处理。
      

  6.   

    看了楼主的代码,感觉楼主可能习惯了使用HQL语句吧,其实 Hibernate还提供了另外一种DetachedCriteria,
    基本语法为:
    DetachedCriteria criteria = DetachedCriteria.forClass(Orders.class);
    criteria.add(Restrictions.eq(orderName, value));
            List<Orders> list = hibernateTemplate.findByCriteria(criteria);
    其实这也是一种不错的查询!可以去试试~!
      

  7.   

    10楼的方法不错,今天特意看了下用Criteria解决条件查询问题很方便,不过还不熟悉,正在学习中。。
      

  8.   

    嗯,第一种是拼接的方式,容易被SQL注入
      

  9.   

    用Criteria吧  在这个问题上比HQL处理的好
      

  10.   

    ord."+name+"
    这个是orders里面的字段吧,貌似不能对字段用占位符的,你真想又第二种方法就这样嘛
    if("COLUMN_NAME1".equal(name)){
    String hql="from Orders as ord where ord.COLUMN_NAME1 <? order by ord.order_number ";
    }else if("COLUMN_NAME2".equal(name)){
    String hql="from Orders as ord where ord.COLUMN_NAME12<? order by ord.order_number "
    }
      

  11.   

    如果name情况不多,16楼的方法可以