问题描述
在使用hibernate的时候.我们经常需要动态的去设置条件参数.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());后面的query设置参数是不确定的..有可能是一个..也有可能是2个..请教大伙在这个方面是怎么处理的. 问题补充:蔡华江 写道
解决方案
设置一个存放object[]的list,在if语句中将:compName及对应的内容存进去。在拼装完成后,遍历了list,取出对应的动态参数
解决方案二:
if(!StringUtils.isEmpty(filter.getCompName())){ sql.append(" and p.company_chinese_name like :compName "); exitsCompName=true; } 首先:你这里已经 if 判读了 判断有就拼这截 没有你 过!其次:直接拼接HQL会被sql攻击这个你也不需要担心!HQL会被sql攻击 不是一般人可以做到的!直接写 sql 语句还可能! LZ 可以自己尝试下!
解决方案三:
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]);}先把值保存起来,,这个。。
解决方案四:
引用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; } 为什么不选择 在拼 HQL 的时候就把参数加进去了!因为你已经写好了 if 判断!
解决方案五:
把参数名称及参数值,设计成一个Map对象,然后遍历Map对象,设置所有参数及其对应的参数值。