1

我正在使用 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 == "") {

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

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

4

3 回答 3

3

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

如果您确实映射到原始字符,并且它为 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 分配给包装器类型)。

于 2008-10-02T13:05:45.640 回答
0

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

于 2010-07-19T12:06:45.803 回答
0

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

假设这是 SQL 查询,给出错误 select username from Users

更改它:从用户中选择LEFT (username, 100 )

数字应该等于字段的大小

于 2011-03-23T16:31:45.833 回答