【问题标题】:could not read column value from result set ; String index out of range: 0无法从结果集中读取列值;字符串索引超出范围:0
【发布时间】:2025-11-28 23:25:02
【问题描述】:

我正在使用 Hibernate SQL Query 从表(来自 MySQL 数据库)中读取数据。 问题是,该表包含一个映射到 Hibernate 模型中的字符的列,有时该列是空的。 我想这就是我的例外的来源。 如何在不出现此错误的情况下将一列 char 映射到我的休眠模型? 感谢您的回答!


感谢您的回答! 我的列不可为空(我正在使用 MySQL,此列不是 NULL) 那我觉得不行

if (str == null) {

合适。

错误是:

15:30:35,289  INFO CharacterType:178 - could not read column value from result set: LSFUS11_20_; String index out of range: 0

导致以下异常:

java.lang.StringIndexOutOfBoundsException: String index out of range: 0
    at java.lang.String.charAt(String.java:558)

我想我可以试试你的解决方案,但是:

if (str == "") {

因为它不能为空,所以它只是一个空字符串。

谢谢你的代码,我去试试!

【问题讨论】:

    标签: java hibernate


    【解决方案1】:

    我从您的问题中假设您将其映射到原始字符。下次,请发布您收到的堆栈跟踪(您可以省略调用它的位置,如果您的项目过于敏感,则只能包含休眠的东西)。

    如果你映射到一个原始字符,并且它是空的,你会得到一个异常,因为基元不能有空分配给它们。

    这个类将缓解这种情况,“null”字符作为表示“0”的字符返回。您可以根据自己的喜好自定义:

    import java.sql.ResultSet;
    import java.sql.SQLException;
    
    import org.hibernate.type.CharacterType;
    
    public class NullCharacterType extends CharacterType {
    
        /**
         * Serializable ID generated by Eclipse
         */
        private static final long serialVersionUID = 1L;
    
        public NullCharacterType() {
            super();
        }
    
        public Object get(final ResultSet rs, final String name)
                throws SQLException {
            final String str = rs.getString(name);
            if (str == null || str.length() == 0) {
                return new Character((char) 0);
            } else {
                return new Character(str.charAt(0));
            }
        }
    }
    

    要在你的休眠映射中使用这种新类型,在你有类似的东西之前:

    <property name="theChar" type="character">
    

    现在,您只需将类名指定为您的类型:

    <property name="theChar" type="yourpackage.NullCharacterType">
    

    但是,最佳做法是不使用原始类型进行数据库映射。如果可能,请使用 Character 而不是 char,因为这样您就不会遇到 null 问题(可以将 null 分配给包装器类型)。

    【讨论】:

      【解决方案2】:

      使用本机函数 LEFT 或 RIGHT 更改源中的列数据类型

      假设这是给出错误的 SQL 查询 从用户中选择用户名

      改变它: 从用户中选择LEFT(用户名,100

      数字应该等于字段的大小

      【讨论】:

        【解决方案3】:

        搜索您的 JBoss(服务器)mysql.jar (mysql-connector-java-5.1.7-bin) 是否存在于 lib 文件中。 即使我遇到了同样的问题,在添加 mysql.jar 文件后它工作正常。

        【讨论】: