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

时间:2008-10-02 12:22:22

标签: java hibernate

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


感谢您的回答! 我的列不可为空(我使用的是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 == "") {

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

感谢您的代码,我将尝试一下!

3 个答案:

答案 0 :(得分:3)

我从你的问题中假设你将它映射到原始角色。下一次,请发布您收到的堆栈跟踪(如果您的项目过于敏感,您可以在您调用它的地方留下,只能包含hibernate内容)。

如果映射到原始字符并且它为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));
        }
    }
}

要在你的hibernate映射中使用这种新类型,之后你会遇到类似的事情:

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

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

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

使用本机函数LEFT或RIGHT更改原点

中的列数据类型

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

改变它: 从用户

中选择 LEFT (用户名, 100

该数字应该等于字段的大小