【问题标题】:Hibernate, Null values and nativeSQLHibernate、Null 值和 nativeSQL
【发布时间】:2010-02-04 09:41:13
【问题描述】:

我在 mySQL 中使用 hibernate,但遇到以下问题:我对一个表执行 nativeSQL 查询,其中包含一个字符长的列。此列可以为空。现在我在查询时收到以下异常:

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 的帖子,但每次都是关于映射到对象和编写自定义类来处理问题。在这种情况下,我需要一个对象数组。我知道一个解决方案可能是更改表,但我会避免它,因为我必须使用预先存在的数据库。那么您有什么可能的解决方案吗?


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

【问题讨论】:

  • 所以列是CHAR(1)?您的实体中的类型是什么?请出示您的代码。
  • 我的实体中没有类型,实际上它是一个 NATIVE SQL QUERY,它将每行返回一个 Object[](每列一个对象)。所以没有实体...
  • 我们需要查看您的代码,尤其是 Hibernate 映射
  • 我再次告诉您,没有映射,因为这是本机 SQL 查询,它返回一个对象数组,就像一个 JDBC 查询一样!
  • 感谢您的呼喊。祝你好运:P(P.S.给出导致此堆栈跟踪的代码):P

标签: mysql hibernate


【解决方案1】:

您使用的是哪个 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 出错,因为这不是CHAR(1)。 (这是CHAR(1) 专栏,是吗?)

【讨论】:

  • 我正在使用 3.2.5 。我想我应该得到一个 JDBC 连接并绕过休眠......你有更好的想法吗?
  • @Gotch:这绝对是一个选项,除了 HQL 之外,您目前还没有使用它的任何功能。我很好奇空字符串如何进入结果集。如果您使用WHERE charCol = '' 手动查询CHAR 列,您会得到结果吗?如果是这样,也许 JDBC 驱动程序有问题,谁知道呢。祝你好运。
【解决方案2】:

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

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

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

数字应该等于字段的大小

【讨论】:

    【解决方案3】:

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

    CASE column_name = '' THEN ' ' ELSE column_name END

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-10
      • 1970-01-01
      • 1970-01-01
      • 2020-10-12
      • 1970-01-01
      • 2011-11-22
      相关资源
      最近更新 更多