在使用hibernate的时候.我们经常需要动态的去设置条件参数.
[code="java"]
StringBuffer sql=new StringBuffer("select * from xxx t where 1=1 ");
if(!StringUtils.isEmpty(filter.getCompCode())){
sql.append(" and t.companyCode = :compCode ");
exitsCompCode=true;
}
if(!StringUtils.isEmpty(filter.getCompName())){
sql.append(" and p.company_chinese_name like :compName ");
exitsCompName=true;
}
Query query = session.createSQLQuery(sql.toString())
query.setParameter("compCode", filter.getCompCode());
[/code]
后面的query设置参数是不确定的..有可能是一个..也有可能是2个..
请教大伙在这个方面是怎么处理的.
设置一个存放object[]的list,在if语句中将:compName及对应的内容存进去。
在拼装完成后,遍历了list,取出对应的动态参数
把参数名称及参数值,设计成一个Map对象,然后遍历Map对象,设置所有参数及其对应的参数值。
[quote]StringBuffer sql=new StringBuffer("select * from xxx t where 1=1 ");
if(!StringUtils.isEmpty(filter.getCompCode())){
sql.append(" and t.companyCode = :compCode ");
exitsCompCode=true;
}
if(!StringUtils.isEmpty(filter.getCompName())){
sql.append(" and p.company_chinese_name like :compName ");
exitsCompName=true;
} [/quote]
为什么不选择 在拼 HQL 的时候就把参数加进去了!
因为你已经写好了 if 判断!
[code="java"]
List list = new ArrayList();
StringBuffer sql=new StringBuffer("select * from xxx t where 1=1 ");
if(!StringUtils.isEmpty(filter.getCompCode())){
sql.append(" and t.companyCode = :compCode ");
list.add(new Object[]{"compCode", filter.getCompCode()});
exitsCompCode=true;
}
if(!StringUtils.isEmpty(filter.getCompName())){
sql.append(" and p.company_chinese_name like :compName ");
list.add(new Object[]{"compName ", filter.getCompCode()});
exitsCompName=true;
}
Query query = session.createSQLQuery(sql.toString())
for(Object[] arr:list){
query.setParameter(arr[0],arr[1]);
}
[/code]
先把值保存起来,,这个。。
if(!StringUtils.isEmpty(filter.getCompName())){
sql.append(" and p.company_chinese_name like :compName ");
exitsCompName=true;
}
首先:你这里已经 if 判读了
判断有就拼这截 没有你 过!
其次:
[code="java"]直接拼接HQL会被sql攻击[/code]
这个你也不需要担心!HQL会被sql攻击 不是一般人可以做到的!
直接写 sql 语句还可能! LZ 可以自己尝试下! :arrow: