日期:2014-05-17  浏览次数:20626 次

急!求叫SQL问题,麻烦解答下。
我用HQL进行条件查询
Java code

String hql="from Orders as ord where ord."+name+" <"+1000+" order by ord.order_number ";
session.createQuery(hql)



Java code

String hql="from Orders as ord where ord.? <? order by ord.order_number";
session.createQuery(hql)
.setString(0, name)
.setInteger(1, 12345)


这两种方式到底有什么本质区别,为什么第一种不报错,而第二种报错?第二种的问号有的字段能用有的字段不能用,比如上面的,那一般在什么情况下用呢?还有第一种拼串的方式不推荐用,那我怎么办呢?
那位高手解答下,感激不尽!

------解决方案--------------------
第一种容易被SQL注入。
第二种是预编译可以防止SQL注入,只不过楼主使用有问题。ord.?貌似不能用setString来传值
------解决方案--------------------
ord.? 这个部分改用判断语句替换可以吗?
例如有name ,id 两个选项;
if(!name.equals("")){
hql = ....;
}
else if(!id.equals("")){
hql = ....;
}
剩下的一个字段就可以使用setInteger()了;
我也不太清楚,只是发表一下个人看法而已。

java7的switch可以对字符串进行选择,真的挺期待的
------解决方案--------------------
探讨
我现在要完成的功能就是用户输入不同的查询条件进行查询,第一种拼串的方法肯定有sql注入的风险,既然第二种不行,难道就没有其他方法了么?

------解决方案--------------------
第二种好,个人意见

祝 楼 主 好 运
------解决方案--------------------
看了楼主的代码,感觉楼主可能习惯了使用HQL语句吧,其实 Hibernate还提供了另外一种DetachedCriteria,
基本语法为:
DetachedCriteria criteria = DetachedCriteria.forClass(Orders.class);
criteria.add(Restrictions.eq(orderName, value));
List<Orders> list = hibernateTemplate.findByCriteria(criteria);
其实这也是一种不错的查询!可以去试试~!
------解决方案--------------------
用Criteria吧 在这个问题上比HQL处理的好
------解决方案--------------------
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 "
}
------解决方案--------------------
如果name情况不多,16楼的方法可以