日期:2014-05-19  浏览次数:20830 次

求hibernate执行原生sql拼凑sql语句的动态参数绑定问题
传递一个map集合 然后我来拼凑sql 语句进行查询。

拼凑是没什么问题 倒是动态绑定参数上 总是报异常 应该是没绑定上的感觉:

org.hibernate.QueryException: Expected positional parameter count: 2, actual parameters: [] [SELECT * FROM user WHERE 1 = 1 AND userId = ? AND name = ? ]

sql 打印出来是SELECT * FROM user WHERE 1 = 1 AND userId = ? AND name = ? 也并没用错


举个例子:

Map map = new HashMap();
map.put("userId",1);
map.put("name","kitty");


Java code
public List getListForSQL(Map<String,Object> map )throws Exception{

 Session session = SessionFactoryUtils.getSession(hibernateTemplate.getSessionFactory(), true);

 String sql =" select * from user  where 1=1 ";

 //map key 有 userId(必有)  name(可选)  password(可选) age(可选)  等..

 int userId = (Integer)map.get("userId")==null ? 0 :(Integer)map.get("userId");
 String name = (String )map.get("name");
 String password = (String)map.get("password");
 String age = (String)map.get("age");

  

if(userId != 0 ){
    sql += " and userid = ? ";

}else{
    if(map.containsKey("userid ")){
         map.remove("userid ");
    }
}

if(name != null && name.length() > 0){
   sql += "  and  name = ? ";
}else{
    if(map.containsKey("name ")){
         map.remove("name ");
    }
}
 

Query query = session.createSQLQuery(sql).setProperties(map);// map传递进去 参数也对, 好像是没绑定?上

List list = query.list();

if(session != null){
   session.close();
}

return list;
}



因为没有实体对应表(是母表拆分N多表) 不能使用hql 只能使用原生sql了
求助各位hibernate 写原生sql 动态拼凑sql语句的达人、


------解决方案--------------------
这问题是set没有生效
主要是没有对应上吧
query.setInteger(arg0, arg1);这个是单个对象(属性)