public List findAll(Long userid, Long cardid) {
Session session = HibernateSessionFactory.getSession();
StringBuffer sb = new StringBuffer();
Transaction tx = null;
Query queryObject = null;
try {
tx = session.beginTransaction();
sb
.append("select new com.telezone.hqllist.CardinfoList( cinfo.cardid  ,cinfo.cardname  , oinfo.ownername   ,uinfo.username , cinfo.phonenum,cinfo.cardstate,cinfo.regdate,cinfo.otherinfo ) from Cardinfo as cinfo left  join cinfo.cardownerinfo as oinfo left join cinfo.userinfo as uinfo where uinfo.userid = :uid ");
// 定位卡
if (null != cardid && !"".equals(cardid)) {
sb.append(" and cinfo.cardid = :cid");
}
queryObject = session.createQuery(sb.toString());
queryObject.setLong("uid", userid);
queryObject.setParameter("cid", cardid);
tx.commit(); } catch (RuntimeException re) {
tx.rollback();
log.error("Cardinfo finaAll failed", re);
}
return queryObject.list();
}
在aciton里面调用这个方法,传值后list。sieze为0 
但是如果写成这样,where uinfo.userid = 200就有数据,这是为什么?还有一个问题:当我传值20,null时,程序报错
org.hibernate.QueryParameterException: could not locate named parameter [cid]请问如何解决?

解决方案 »

  1.   

    你的数据库内的数据具体是什么我也不知道,我先说一下你的第二个错,当你的第二个参数是空时,你不执行if里面的语句,那你的hql语句里就没有" and cinfo.cardid = :cid"这一句,可是你又有queryObject.setParameter("cid", cardid);程序当然报错了,因为你没有cid这个参数。
    对于你的第一个问题,我感觉不是程序的问题,原因可能是你数据库中的数据userid=200时才有数据,当userid=20时没有数据,你再看看数据库是不是没有你想查的用户id
      

  2.   

    queryObject.setLong("uid", userid);
    pojo类跟映射文件中的类型是不是都是Long,还有在数据库中是不是bigint
      

  3.   

    所说至于第一个问题,那就应该涉及到string 的拼装,我在试试看
      

  4.   

    你把queryObject.setParameter("cid", cardid);再放在一个if里判断条件和上面的if相同试试。刚才我的意思就是在你第二个参数是null的时候你没有cid这个参数,但还是执行queryObject.setParameter("cid", cardid);这个赋值操作了,所以报错。