Hibernate,Null值和nativeSQL

时间:2010-02-04 09:41:13

标签: mysql hibernate

我正在使用hibernate和mySQL,我遇到了以下问题:我在一个表上执行 nativeSQL 查询,其中包括一个字符长的列。此列可以为null。现在,我在查询时收到以下异常:

4-feb-2010 10.31.00 org.hibernate.type.NullableType nullSafeGet
INFO: could not read column value from result set: nazeuro; String index out of range: 0
java.lang.StringIndexOutOfBoundsException: String index out of range: 0
        at java.lang.String.charAt(String.java:686)
        at org.hibernate.type.CharacterType.get(CharacterType.java:29)
        at org.hibernate.type.NullableType.nullSafeGet(NullableType.java:163)
        at org.hibernate.type.NullableType.nullSafeGet(NullableType.java:189)
        at org.hibernate.loader.custom.CustomLoader$ScalarResultColumnProcessor.extract(CustomLoader.java:474)
        at org.hibernate.loader.custom.CustomLoader$ResultRowProcessor.buildResultRow(CustomLoader.java:420)
        at org.hibernate.loader.custom.CustomLoader.getResultColumnOrRow(CustomLoader.java:317)
        at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:606)
        at org.hibernate.loader.Loader.doQuery(Loader.java:701)
        at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:236)
        at org.hibernate.loader.Loader.doList(Loader.java:2220)
        at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2104)
        at org.hibernate.loader.Loader.list(Loader.java:2099)
        at org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:289)
        at org.hibernate.impl.SessionImpl.listCustomQuery(SessionImpl.java:1695)
        at org.hibernate.impl.AbstractSessionImpl.list(AbstractSessionImpl.java:142)
        at org.hibernate.impl.SQLQueryImpl.list(SQLQueryImpl.java:152)
        at Views.Components.QuickLookup$updater.run(QuickLookup.java:102)

我一直在谷歌搜索解决这个问题,我甚至在SO上找到了帖子,但每次都是关于映射到对象和编写自定义类来处理问题。在这种情况下我需要的是一个Object数组。我知道一个解决方案可能是更改表,但我会避免它,因为我要使用预先存在的数据库。你有什么可能的解决方案吗?


SQLQuery query = sess.createSQLQuery("SELECT * from " + table + " WHERE " + filter + " LIKE '" + search + "%'");
                    System.out.println(query.toString());
                    List<Object[]> result = query.list();

3 个答案:

答案 0 :(得分:3)

您使用的是哪种Hibernate版本?在3.3.2中,这是CharacterType.get()

public Object get(ResultSet rs, String name) throws SQLException {
    String str = rs.getString(name);
    if (str==null) {
        return null;
    }
    else {
        return new Character( str.charAt(0) );
    }
}

如果这不明显,则异常表示您从结果集中获得了一个空的非空字符串(""),这导致CharacterType为barf,因为这不是CHAR(1)的预期值。 (这是一个CHAR(1)列,是吗?)

答案 1 :(得分:0)

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

中的列数据类型

让我们假设这是一个SQL查询,它给出了用户

中的错误选择用户名

更改时间:从用户中选择 LEFT (用户名, 100

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

答案 2 :(得分:0)

对表格中的每个字符列使用CASE表达式

CASE column_name =&#39;&#39;那么&#39; &#39; ELSE column_name END