Query q = session.createQuery("update User u set u.birthday=:bday , u.realName=:rn , u.sex=:sex , u.birthPlace=:bP , u.livePlace=:lp , u.bloodType=:bt where u.username=:username ");
q.setParameter("bday", u.getBirthday());
q.setParameter("rn", u.getRealName());
q.setParameter("sex", u.getSex());
q.setParameter("bP", u.getBirthPlace());
q.setParameter("lp", u.getLivePlace());
q.setParameter("bt", u.getBloodType());
q.setParameter("username", u.getUsername());
q.executeUpdate();
总是报“could not lacate named parameter [username]”的错误。上面插入的所有值debug过,都是有的,User u的所有属性名都没问题,update语句的语法估计也是这个样的呀,数据库表中也有username这个属性,忘大家指出我粗心大意的地方。

解决方案 »

  1.   

    很少使用hql,有人帮我解决么,分全给!!!!!
      

  2.   

    你先把username固定下试试,q.setParameter("username", u.getUsername());去掉update User u set u.birthday=:bday , u.realName=:rn , u.sex=:sex , u.birthPlace=:bP , u.livePlace=:lp , u.bloodType=:bt where u.username='xxxxx'能能否正常执行
      

  3.   

    不行的,之前固定过“id”和“username”两个表头,分别报
    could not lacate named parameter [id]
    或could not lacate named parameter [username]
    的错误,而且username是有的····
      

  4.   

    语法感觉没有问题,
    那你把参数的值都替换一下,然后直接在sql客户端里执行试试呢
      

  5.   

    如果我把hql语句直接写成
    “update User u set u.realName='aaa' where u.username='disalong'”
    这下够简单了吧,然后用junit测试还是不行,报的错误是:
    unecpected token: xxxx [update User u set u.realName='aaa' where u.username='disalong']
    感觉已经不是hql的问题了,应该是我的表结构有问题,但是明显的我的User类中有
    username和realName两个属性,也是根据hibernate的关联关系生成表的,搞不懂···还有我的User表中有很多的外键表头关联着其他表,这不会是出问题的地方吧,没有头绪
      

  6.   

    我把hql换成sql在命令行中执行也是没问题的,这能说明问题么?
      

  7.   

    这个问题暂时不去纠结了,本来想用hql提高一下效率,出个这样的问题,
    网上找半天找不出原因,才到这里问问,估计还是解决不了。
    用回session.update()了,效率是低一点,好歹能解决问题,不想花时间钻这点东西
      

  8.   

    查看一下Hibernate的映射文件,我觉得有可能是你的映射的字段的问题
      

  9.   

    我是用annotation来映射的,没有修改过字段名,而且我检查了一下,
    user表中的字段名和User类的属性名一致的。至少username是一致的,
    但是它却说“无法定位username”,虽然方法多的是,但是我始终还是
    想知道为什么。
      

  10.   

    楼主代码是复制过来的吗?如果是的话那就是中文空格导致的,你username后边是个中文空格,检查下吧