缘由:由于客户方漏扫工具,扫描判断我们系统中动态HQL语句有注入风险。(画外音:其实这些参数都是内部使用的,根本没有外部侵入可能)
解决:防御sql注入最好的办法就是预编译
对于参数的很好解决:
HQL参数名称绑定
Query query=session.createQuery(“from User user where user.name=:customername and user:customerage=:age ”);
query.setString(“customername”,name); query.setInteger(“customerage”,age);
HQL参数位置邦定:
Query query=session.createQuery(“from User user where user.name=? and user.age =? ”);
query.setString(0,name);
query.setInteger(1,age);
setParameter()方法:
String hql=”from User user where user.name=:customername ”;
Query query=session.createQuery(hql);
query.setParameter(“customername”,name,Hibernate.STRING);
setProperties()方法:
将命名参数与一个对象的属性值绑定在一起
Customer customer=new Customer(); customer.setName(“pansl”);
customer.setAge(80);
Query query=session.createQuery(“from Customer c where c.name=:name and c.age=:age ”);
query.setProperties(customer);
setProperties()方法会自动将customer对象实例的属性值匹配到命名参数上,但是要求命名参数名称必须要与实体对象相应的属性同名。
但是对于bean的注入怎么办呢???
例如这种:
public Query getQueryFromId(Long id, String segName) {
StringBuilder sql = new StringBuilder();
sql.append(" from " + segName + " WHERE id = ?1");
Session session = (Session) em.getDelegate();
Query query = session.createQuery(StringEscapeUtils.escapeSql(sql.toString()));
query.setParameter("1", id);
query.setFirstResult(0);
query.setMaxResults(1);
return query;
}
直接上正题:
try {
s=HIbernateUtil.getSession();
//使用Criteria接口
Criteria c = s.createCriteria(User.class);
//对查询添加限制条件,相当于where子句。"name"必须是类中具有的属性
//Criteria相当于一个容器,约束可以一直加
c.add(Restrictions.eq("name", name)); //等于
// c.add(Restrictions.gt("birthday",new Date())); // 大于
c.add(Restrictions.lt("birthday",new Date())); // 小于
//以上条件之间是and的连接方式,当然也可以用一下的or连接方式
// c.add(Restrictions.or(lhs, rhs));or 两个条件
//Criteria实现分页,hql的方法名基本相同
c.setFirstResult(0);// 从哪条开始取
c.setMaxResults(10);// 共取多少条
List<User> list=c.list(); //executQuery();
for(User user:list){
System.out.print(user.getName());
}
//如果确定数据最多只有一条,可以使用一下的方法简化代码
User u= (User)c.uniqueResult();
System.out.print("只有一条数据"+u.getName());
} finally {
if(s!=null){
s.close();
}
}
补充说明:如果是修改、删除可以使用参照如下源码
/**
* Create an instance of Query for executing a criteria
* update query.
*
* @param updateQuery a criteria update query object
* @return the new query instance
* @throws IllegalArgumentException if the update query is found to be invalid
*/
public Query createQuery(CriteriaUpdate updateQuery);
/**
* Create an instance of Query for executing a criteria
* delete query.
* @param deleteQuery a criteria delete query object
* @return the new query instance
* @throws IllegalArgumentException if the delete query isfound to be invalid
*/
public Query createQuery(CriteriaDelete deleteQuery);