当前位置: 代码迷 >> J2EE >> Hibernate 查询结果为空,没有报错误,求解释,求解决
  详细解决方案

Hibernate 查询结果为空,没有报错误,求解释,求解决

热度:18   发布时间:2016-04-17 23:35:10.0
Hibernate 查询结果为空,没有报异常,求解释,求解决!
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")+ "%" );

------解决思路----------------------
引用:
Quote: 引用:

上面写错了, 
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的没问题。
------解决思路----------------------
引用:
Quote: 引用:

Quote: 引用:

上面写错了, 
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
  相关解决方案