如题,运行环境是oracle数据库(虚拟机中),今天换了mysql数据库(同机器)之后 测试是通过的,没用报错。
项目介绍:hibernate +struts框架 开发工具是myeclipes9.0;目前是在用户登录认证的过程里面,需要用户输入ID或者用户名+密码。进行登录验证。
遇到情况“: 为了可以让用户随意输入ID或者用户名,采取了如下优化,如果用户输入的是非数字,进设置用户名,如果输入是数字,则设置用户名跟ID均为其值,在hql语句中两者只需要是or的关系即可成立,而且设置的值亦可是null; 
 在loginAction中代码如下:
Users user = new Users();
String userid = loginForm.getUserid();
user.setPassword(loginForm.getPassword())
;user.setUsername(userid);//检验用户输入是否为数字,如果是数字在可认为是用户ID
try {
int i = Integer.parseInt(userid);
user.setUserid(i);
} catch (NumberFormatException e) {}
UserServiceInter userServiceInter=new UserService();
user=userServiceInter.checkUser(user);
在UserService中如下代码
//此处特别说明。如果传入的是非中文可以通过,中文无法通过,待解
//String hql="from Users where (username=? or userid=?) and password=?";
//String parameters[]={user.getUsername() ,user.getUserid()+"" ,MyTools.MD5(user.getPassword())};
String hql="from Users where username=?  and password=?";
String parameters[]={user.getUsername(),MyTools.MD5(user.getPassword())};
经过测试,如果输入的用户名是英文或者数字的时候可以顺利通过,如果输入的用户名是汉字则抛出java.lang.RuntimeException: could not execute queryat com.lw.utils.HibernateUtil.UniqueExcute(HibernateUtil.java:47)at com.lw.service.imp.UserService.checkUser(UserService.java:19)at com.lw.struts.action.LoginAction.login(LoginAction.java:46)异常。
有点费解,是BUG?还是某处编码出错,已经加了过滤器了,而且在此处读取到的用户名没用乱码是正常的。诸位有没解决方案,新手啊,郁闷死了。Java hibernatestruts

解决方案 »

  1.   

    看异常提示貌似是唯一约束,也就是用户的什么属性是唯一的,你的这个hql请求为范围唯一约束。
      

  2.   

    同样的改成mysql数据库就正常了,简单的来讲就是hql语句在用orcale的时候如果()里面的值有中文就报出那样的错误,唯一值设置的是id,应该没影响吧
      

  3.   

    ...我只是说我在1楼里写错字了
    sorry,看错异常了,异常只是说不能执行这句hql
    建议拿其他允许包含中文信息的字段试一下,如果是中文的问题导致不能执行,任何字段都是同样的结果。
    确定是这个问题后就可以确定是字符编码的问题。
      

  4.   

    你的参数用占位符试试,或者用Critiria查询代替