无法从结果集中读取列值;字符串索引超出范围:0

时间:2020-03-06 15:01:22  来源:igfitidea点击:

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

谢谢回答 !
我的列不可为空(我正在使用MySQL,并且此列不可为空)
那我不认为

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 == "") {

因为它不能为null,所以它只是一个空的String。

感谢邮政编码,我将尝试尝试!

解决方案

我从问题假设我们正在将此映射到原始字符。下次,请发布我们收到的堆栈跟踪信息(我们可以在调用它的地方省略,如果项目过于敏感,则只能包含休眠的内容)。

如果确实映射到基本字符,并且它为null,则将出现异常,因为基本不能分配null。

此类将减轻这种情况," 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分配给包装器类型)。

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