dao层代码:
public List<IOSActive> list(Map<String,String> params){
StringBuffer hql = new StringBuffer("from IOSActive where 1=1");
if(StringUtil.valid(params.get("channelID"))){
hql.append(" and channelID='?' ");
}
if(StringUtil.valid(params.get("status"))){
hql.append(" and status='?' ");
}
if(StringUtil.valid(params.get("adID"))){
hql.append(" and adID='?' ");
}
if(StringUtil.valid(params.get("appID"))){
hql.append(" and appID= '?' ");
}
if(StringUtil.valid(params.get("idfa"))){
hql.append(" and idfa='?' ");
}
if(StringUtil.valid(params.get("mac"))){
hql.append(" and mac='?' ");
}
if(StringUtil.valid(params.get("openUDID"))){
hql.append(" and openUDID='?' ");
}
System.out.println("idfa-->"+params.get("idfa"));
System.out.println("adID-->"+params.get("adID"));
System.out.println("appID-->"+params.get("appID"));
System.out.println("hql-->"+hql.toString());
return super.find(hql.toString(), params);
}
super.find() 代码:
public <X> List<X> find(final String hql, final Map<String, ?> values) {
return createQuery(hql, values).list();
}
public Query createQuery(final String queryString, final Map<String, ?> values) {
Assert.hasText(queryString, "queryString不能为空");
Query query = getSession().createQuery(queryString);
if (values != null) {
query.setProperties(values);
}
return query;
}
控制台输出的结果:
idfa-->JIOFAJEI
adID-->1
appID-->2341
hql-->from IOSActive where 1=1 and adID='?' and appID= '?' and idfa='?'
手动将参数填写进去,直接从数据库查询是可以得到结果的,这是为什么呢?
------解决思路----------------------
参数注入失败了。 把channelID='?' 这种改了 channelID=:xxx; 这个xxx 是params里面的key。
------解决思路----------------------
if(params.get("channelType")!=null){
hql.append(" and channelType in :channelType");
}
query.setProperties内部会自动判断params中channelType对应的value类型,不用加();跟其它一样remove那句话去掉。
like的话要这样。
if(params.get("channelName")!=null){
hql.append(" and channelName like :channelName");
params.put("channelName", "%" +channelName + "%" );
}
我假设你params有channelName, 用"%" +channelName + "%" 把原本的字符串覆盖掉,语句里面不加%%。
你试下
------解决思路----------------------
上面写错了,
params.put("channelName", "%" +params.get("channelName")+ "%" );
------解决思路----------------------
哦, 我没注意哦, 你是Map<String, String>; channelType=0,2 这样肯定不行呀。
channelType 的实际类型必需是容器类或者数组,才能使用in,0,2这样的字符串肯定不行。 你试着调整吧。
like的没问题。
------解决思路----------------------
上面写错了,
params.put("channelName", "%" +params.get("channelName")+ "%" );
hql:
from Channel where 1=1 and channelType in :channelType and channelName like :channelName
map是这样:
{channelName=%有%, channelType=0,2}
like 后面':channelName' 或者 :channelName 都会报错
哦, 我没注意哦, 你是Map<String, String>; channelType=0,2 这样肯定不行呀。
channelType 的实际类型必需是容器类或者数组,才能使用in,0,2这样的字符串肯定不行。 你试着调整吧。
like的没问题。
如果你方法入参一定是Map<String, String>,且一定要用in, 必需重新创建一个Map<String, Object> map;
map.put("channelType", params.get("channelType").split(",")):
channelName字段也放进map, 把这个map传入findPage