使用中文条件在session.createQuery(hql)中查询失败以及get方法中文返回问号(编码格式)错误分析及解决

博客主要讲述向数据库发送select请求查询用户名数据时遇到的问题。当用户名是数字可正常查询,英文字符和中文则无法返回数据。经分析,可能是查询方法使用错误或hql语句写错,后发现是编码格式问题,将编码转换为utf - 8并注意数据库默认编码后问题解决。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述:

向服务器向数据库发送select请求,返回用户名是xxx的数据。我遇到的问题是当我的用户名是数字的时候,可以进行查询并返回。当是英文字符和中文的时候,无法返回数据。

分析及解决过程

向数据库的查询过程代码如下:

 public List<HeartRate> selectAllheart(String userName) {
        List<HeartRate> heartrates = new ArrayList<>();
        Session session = this.getSession(true);
        Transaction tc = session.beginTransaction();
        //hql语句一
        List list = session.createQuery("From HeartRate where userName = "+userName+"order by heartId desc").list();
        //hql语句二
        //List list = session.createQuery("From HeartRate u where u.userName =:userName order by heartId desc").setString("userName",userName).list();
        for (Iterator iterator = list.iterator(); iterator.hasNext(); ) {
            HeartRate heartrate = (HeartRate) iterator.next();
            heartrates.add(heartrate);
        }
        try {
            tc.commit();
        } catch (Exception e) {
            e.printStackTrace();
        }
        session.close();
        return heartrates;
    }

}

使用session.createQuery创建查询语句

Hibernate中session.createQuery()与session.createSQLQuery()的区别


Query createQuery ( String queryString)
创建一个查询字符串中给定的HQL查询新的实例。
参数:HQL查询
返回值:Query查询
抛出异常:HibernateException


SQLQuery createSQLQuery ( String queryString)
创建一个新的查询字符串给定的SQL实例SQLQuery的。
参数:SQL查询
返回值:SQLQuery
抛出异常:HibernateException

简单来说,createQuery使用hql语句进行查询,以Hibernate生成的Bean为对象,并将对象装入List中返回。
createSQLQuery使用sql语句进行查询,是以对象数组形式返回。

使用hql语句一时,查询中文服务器返回错误

unexpected token: by near line 1, column 67 [From com.message.server.model.HeartRate where userName = qunorder by heartId desc]

在这里插入图片描述
根据这个报错,原因有如下两个可能:

  • 1.在 hibernate 里面写sql执行时候使用了 session.createQuery(sql); 需要用 session.createSQLQuery(sql),或者是session.createQuery(hql) 而将 hql 语句写错;

  • 2.在 hibernate 里面写hql执行是误把hql写成了sql,比如说:select * from 表名,hibernate框架操作数据库的核心就是:用操作数据对象代替操作表,给程序员的感觉是面向对象操作数据库所以查询语句from后面接的不是表名称,而是javabean数据对象名

在这里插入图片描述改成这样之后,发现英文用户名可以正常的返回结果。但是中文字符没有返回。
在这里插入图片描述
在服务器端控制台打印web端模拟Android端发送的请求,在服务器端打印获得的用户名发现是???
在这里插入图片描述
这个问题是由于编码格式的问题。应该选用UTF-8
在客户端发送的数据就是UTF-8格式的数据。所以是在服务器端Java代码没有按照UTF-8格式读取数据。

加入下面的代码将编码转换为 utf-8

//把ISO-8859-1编码的值变成utf-8
new String(value.getBytes("ISO-8859-1"), "utf-8");

在这里插入图片描述再次测试可以正常打印用户名并返回数据

在这里插入图片描述

在这里插入图片描述问题解决。同时还要注意数据库的默认编码格式是不是UTF-8,在applicationContext.xml 中设置

 <!-- 数据库配置 -->
    <bean id="dataSource"
          class="org.apache.commons.dbcp.BasicDataSource">
        <property name="driverClassName"
                  value="com.mysql.jdbc.Driver">
        </property>
        <property name="url"
                  value="jdbc:mysql://**.**.**.***:8888/userdao?useUnicode=true&amp;characterEncoding=UTF-8&amp;autoReconnect=true">
                  <!-- 需设置characterEncoding=UTF-8 &amp;autoReconnect=true-->
        </property>
        <property name="username" value="*****"></property>
        <property name="password" value="******"></property>
        <property name="maxActive" value="5" />
        <property name="maxIdle" value="40" />
        <property name="defaultAutoCommit" value="false" />
        <property name="timeBetweenEvictionRunsMillis" value="3600000" />
        <property name="minEvictableIdleTimeMillis" value="3600000" />
    </bean>
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值