大家好,我在做SSH过种中,碰到一个问题,找了很久都没有答案:
在Struts中用Hibernate根据用户名和密码查询用户中:
如果用户名为中文字符,比如(张三,123456),刚语句
from UserAccount where name=? and passwd=?
返回的列表为空,但是在SQL*Plus中执行语句
select count(*) from user_account where name='张三' and passwd='123456';
则返回1;
但是如果用户名为半角字符,比如(zhangsan,123456),则Hibernate可以正确返回!!说明下:
我的程序字符集是UTF-8;
如果查询全部from UserAccount可以全部查出,并且名字都能显示正确;
目前也许就只是参数不能为中文.不知是该如何解决,请各位高手多多指教?多谢了.

解决方案 »

  1.   

    楼主可以用这个查一下库的字符集SQL> select * from nls_database_parameters where parameter in ('NLS_CHARACTERSET','NLS_NCHAR_CHARACTERSET');看看结果,应该是和你的不一致,楼主用的是windows吧?
      

  2.   

    hibernate字符集?
    hibernate.cfg.xml
    <?xml version='1.0' encoding='UTF-8'?>Struts2字符集?
    struts.properties
    struts.i18n.encoding=UTF-8Struts1字符集?
    web.xml
      <filter>
        <filter-name>Set Character Encoding</filter-name>
        <filter-class>..SetCharacterEncodingFilter</filter-class>
        <init-param>
          <param-name>encoding</param-name>
          <param-value>UTF-8</param-value>
        </init-param>
      </filter>
      <filter-mapping>
        <filter-name>Set Character Encoding</filter-name>
        <url-pattern>/*</url-pattern>
      </filter-mapping>还有服务器字符集,如tomcat
    C:\Program Files\Apache Software Foundation\Tomcat 5.5\conf\server.xml
        <Connector
    port="8080"               maxHttpHeaderSize="8192"
                   maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
                   enableLookups="false" redirectPort="8443" acceptCount="100"
                   connectionTimeout="20000" disableUploadTimeout="true" URIEncoding="UTF-8"/>慢慢查吧,麻烦
      

  3.   

    感谢二位的热心帮助,我仔细查过了,所有的地方都是UTF-8编码.
    我发现一个问题:
    如果HQL不用占位符,而是直接拼接成SQL语句,查询正确.List<UserAccount> users = this.hibernateTemplate.find("from UserAccount where name=? and passwd=?", new String[]{name, passwd});当参数中有中文时,查询返回为空;但是:
    StringBuilder sql = new StringBuilder();
    .........(把参数拼接成一条SQL语句)
    List<UserAccount> users = this.hibernateTemplate.find(sql.toString());却可以正确返回.
      

  4.   

    参数可以先处理一下
    String str = new String("张三".getBytes("iso-8859-1"),"utf-8");
      

  5.   


    1. 在调用hsql之前,把name打印出来看看,
    2. 配置log或者配置p6spy作为jdbc driver,把参数和sql打出来看看。