我用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可以对字符串进行选择,真的挺期待的
------解决方案--------------------
------解决方案--------------------
第二种好,个人意见
祝 楼 主 好 运
------解决方案--------------------
看了楼主的代码,感觉楼主可能习惯了使用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楼的方法可以